springrain技术详解(3)-shiro的filterChainDefinitions
发布日期:2021-09-30 18:11:06 浏览次数:10 分类:技术文章

本文共 1628 字,大约阅读时间需要 5 分钟。

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

shiro在web.xml中配置全局过滤器,springrain配置的是一个spring bean “shiroFilter”,在这个bean中可以根据访问路径再配置不同的过滤器,

shiro 默认自带的过滤器如下:

Filter Name Class
anon
authc
authcBasic
logout
noSessionCreation
perms
port
rest
roles
ssl
user

我们平常用的就是 anon:任何人都可以访问;authc:必须登录才能访问,不包含rememberme ;user:登录用户才可以访问,包含rememberme ;perms:指定过滤规则,这个一般是扩展使用,不会使用原生的,例如springrain扩展的为frameperms.

filterChainDefinitions 就是指定过滤规则的,一般是把公共配置使用配置文件,例如 js  css img 这些资源文件是不拦截的,业务相关的url配置到数据库,有过滤器查询数据库进行权限判断.

不要想着把所有的url都配置到配置文件,这是一个误区!

springrain的配置如下图:

filterChainDefinitions

拦截器的优先级是从上至下,如果有匹配的拦截器就会返回,例如 访问 /js/abc.js 第一个拦截器 anon符合,就返回true了,不再往下匹配了.

最后一句是 /**=user,frameperms 意思就是除了上面的那些,其他的所有都要经过 user和frameperms.如果没有登陆 user就会阻断,不会执行到frameperms.

frameperms 就是我们自定义实现的过滤器,从数据库中查询用户的权限,判断当前用户是否有权限访问拦截的url.

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

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

// 添加角色及权限信息		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权限:

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

这个基本就是权限校验的流程

本文出自 9iu.org,转载时请注明出处及相应链接。

本文永久链接: http://www.9iu.org/2013/12/12/springrain3-shiro-filter.html

0

转载地址:https://blog.csdn.net/iteye_10343/article/details/82671987 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:springrain技术详解(4)-shiro的缓存
下一篇:springrain技术详解(2)-权限表结构

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月04日 07时52分49秒