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. Onvif开发之客户端搜索篇

    关于ONVIF的广播,有客户端搜索和服务端发现的区别:客户端向固定的网段和固定的端口发送广播消息,服务端在对应的端口回复广播请求消息本文首先介绍客户端如何进行广播的已经对广播回复的信息的基本处理. 客 ...

  2. 1.Maven之(一)Maven是什么

    转自:https://blog.csdn.net/xhxmister/article/details/79409208 首先,Maven的正确发音是[ˈmevən],而不是“马瘟”以及其他什么瘟.Ma ...

  3. 【基础篇】Android下拉列表框(Spinner)的基本使用

    个人学习经验:第一步:新建工程,在main.xml中,main.xml内容如下: <?xml version="1.0" encoding="utf-8" ...

  4. 手机端使用rem的适配

    <html> <body> <!-- http://www.w3cfuns.com/notes/29143/79dafb7c07f6865f435af641869d312 ...

  5. html页面中块级元素的居中

    第一:在页面中使用 margin: 0 auto;居中: <div> <p>夜屋</p> </div> div { width: 100%; posit ...

  6. ES6第三节:变量的解构赋值

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.下面我们看实际的例子: 一.数组解构: let [a,b,c] = [1,2,3]; console.log(a); //a ...

  7. [React Native] Animate the Scale of a React Native Button using Animated.spring

    In this lesson we will use Animated.spring and TouchableWithoutFeedback to animate the scale of a bu ...

  8. visibility-控件的显示跟隐藏设置

    在Android开发中,大部分控件都有visibility这个属性,其属性有3个 visible:可见 invisible:不可见,但是会占据原来的位置 gone:不可见,也不会占据原来的位置 可见( ...

  9. Office Open XML导出大数据

    Office Open XML导出大量数据到 Excel .NET使用Office Open XML导出大量数据到 Excel我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原 ...

  10. OC文件操作、获取文件属性

    #import <Foundation/Foundation.h> //获取文件的属性 int main(int argc, const char * argv[]) { @autorel ...