springrain使用shiro控制权限,配置filterChainDefinitions结合数据库校验权限。

我们在web.xml中配置一个全局过滤器,也就是在springrain配置的是一个spring bean的“shiroFilter“,在这个bean中可以根据访问路径在配置不同的过滤器,其中shiro默认自带的过滤器如下:

Filter Name

                    Class

anon                  org.apache.shiro.web.filter.authc.AnonymousFilter

authc                   org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic         org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

logout                  org.apache.shiro.web.filter.authc.LogoutFilter

noSessionCreation  org.apache.shiro.web.filter.session.NoSessionCreationFilter

perms                  org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port                            org.apache.shiro.web.filter.authz.PortFilter

rest                          org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles                          org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl                          org.apache.shiro.web.filter.authz.SslFilter

user                          org.apache.shiro.web.filter.authc.UserFilter

我们平时使用就是anno,任何人都可以访问;authc:必须是登录之后才能进行访问,不包括remember
me;user:登录用户才可以访问,包含remember me;perms:指定过滤规则,这个一般是扩展使用,不会使用原生的;其中filterChainDefinitions 就是指定过滤规则的,一般公共配置使用配置文件,例如jss css img这些资源文件是不拦截的,相关业务的url配置到数据库,有过滤器查询数据库进行权限判断。

例:springrain的配置如下图:

拦截器的优先级:从上到下,从左到右,如果有匹配的拦截器就会阻断并返回,例如:访问js/a.js,第一个拦截器anon符合,就返回true了,不在往下进行匹配了,注意最后一个拦截最后一句是
/**=user,frameperms 意思就是除了上面的那些,其他的所有都要经过 ,user和frameperms.如果没有登陆 user就会阻断,不会执行到frameperms.frameperms 就是我们自定义实现的过滤器,从数据库中查询用户的权限,判断当前用户是否有权限访问拦截的url.

其中具体拦截的工作流程是怎么样的呢?

1:认证和授权的 realm.例如springrain扩展的shiroDbRealm,在doGetAuthorizationInfo授权方法里

  1. // 添加角色及权限信息
  2. SimpleAuthorizationInfo sazi = new SimpleAuthorizationInfo();
  3. try {
  4. sazi.addRoles(userRoleMenuService.getRolesAsString(userId));
  5. sazi.addStringPermissions(userRoleMenuService
  6. .getPermissionsAsString(userId));
  7. } catch (Exception e) {
  8. logger.error(e);
  9. }
  10. return sazi;
              // 添加角色及权限信息
SimpleAuthorizationInfo sazi = new SimpleAuthorizationInfo();
try {
sazi.addRoles(userRoleMenuService.getRolesAsString(userId));
sazi.addStringPermissions(userRoleMenuService
.getPermissionsAsString(userId));
} catch (Exception e) {
logger.error(e);
} return sazi;

sazi.addRoles:获取当前用户所有的角色,用于依据角色判断权限的shiro过滤器,springrain中没有使用

sazi.addStringPermissions:获取当前用户的所有权限,springrain中的权限就是url,所以在springrain中这就是一个url的集合

我们的拦截器每次校验权限都会调用doGetAuthorizationInfo,获取当前用户的所有权限.

我们的权限拦截器 只要判断当前用户访问的url是否在他的权限集合内就可以了,例如 springrain中frameperms 的校验url权限:

  1. //会调用realm的doGetAuthorizationInfo授权方法  
  2. permitted= subject.isPermitted(uri);  
//会调用realm的doGetAuthorizationInfo授权方法

permitted= subject.isPermitted(uri);

shiro 中的filterChainDefinitions详解(转)的更多相关文章

  1. Shiro的Filter机制详解---源码分析

    Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...

  2. Shiro的Filter机制详解---源码分析(转)

    Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...

  3. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  4. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  5. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  6. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  7. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  8. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  9. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

随机推荐

  1. js插件---jqGrid插件如何使用

    js插件---jqGrid插件如何使用 一.总结 一句话总结:jqdrid还是依赖加js初始化的方式,很多时候插件的问题一般都是引入的css和js的问题,jqgrid里面遇到的问题就是下载包有一些js ...

  2. Torch 的安装与基本用法

    本文安装仅限 ubuntu 系统.官方文档见:Getting started with Torch. 0. 简介 Torch 使用轻量级脚本语言 Lua 及其 C/CUDA 扩展模块实现,底层数值计算 ...

  3. POJ 3175 枚举

    思路: 枚举小数点前 的数是啥 判一判 复杂度是根号的-.. 注意精度!!!! //By SiriusRen #include <cmath> #include <cstdio> ...

  4. OpenCV特征点检测——Surf(特征点篇)&flann

    学习OpenCV--Surf(特征点篇)&flann 分类: OpenCV特征篇计算机视觉 2012-04-20 21:55 19887人阅读评论(20)收藏举报 检测特征 Surf(Spee ...

  5. 分享一个表格插入和删除编辑功能用jQuery实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Jquery Validator 增加自定义验证方法

    $(document).ready(function () { jQuery.validator.addMethod("namerepeate", function(value, ...

  7. POJ 2481 Cows (线段树)

    Cows 题目:http://poj.org/problem?id=2481 题意:有N头牛,每仅仅牛有一个值[S,E],假设对于牛i和牛j来说,它们的值满足以下的条件则证明牛i比牛j强壮:Si &l ...

  8. shape- 设置虚线

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  9. 深入理解Java内存模型--转载

    原文地址:http://www.infoq.com/cn/articles/java-memory-model-1 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之 ...

  10. Atcoder At Beginner Contest 068 C - Cat Snuke and a Voyage

    C - Cat Snuke and a Voyage Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem State ...