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. Scott Hanselman的问题-3

    .Net程序员面试 中级篇 (回答Scott Hanselman的问题)   继<.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)>跟<.Net程序员 ...

  2. LuoguP2763 试题库问题(最大流)

    建图同_____ 代码: #include<queue> #include<cstdio> #include<cstring> #include<algori ...

  3. Python3.7&Django1.11.15 兼容性问题

    环境: 1. Windows10 2. python3.7 3. Django1.11.15 启动Django时抛出以下异常: Unhandled exception in thread starte ...

  4. PHP截取字符串长度

    <?php function str_cut($string, $start=0,$length, $dot = '..') {    $strlen = strlen($string);    ...

  5. android抓取各种log的方法

    1.logcat (四类log buffer是main,radio.system.events) adb wait-for-device logcat adb logcat -v time > ...

  6. 4个开源的Gmail替代品

    资料来源 https://opensource.com/alternatives/gmail 本文是对原文翻译,在调试 privmx 时么有成功,这些代码大多用于 php5 ,对PHP7 不兼容. 相 ...

  7. 用 OPENSSL 生成不同格式的密钥

    用 OPENSSL 生成不同格式的密钥 密钥 key 值包括 加密算法: RSA/DSA/ECC 加密位数: 1024/2048/4096 密钥口令:加密方式有很多 在使用 DSA/ECC 加密算法时 ...

  8. listview-fading 滚动条样式设置

    fadingEdge-属性用来设置拉滚动条时 ,边框渐变的方向.它有三个属性值可以设置 none:(边框颜色不变) horizontal:(水平方向颜色变淡) vertical:(垂直方向颜色变淡). ...

  9. vim 窗口分割命令

    如何在一个窗口下面同时打开两个以及以上的文件,有横向跟纵向两种方式 一.如果在终端中开没有打开vim,可以: 横向分割显示: $ vim -o filename1 filename2 纵向分割显示: ...

  10. the way to go

    推荐两本书 关于go语言的 The way to go Go语言编程高清完整版电子书.pdf