shiro配置filterchaindefinitions实现多角色判定方法的重写
2016-03-23 13:48
260 查看
不知道在使用shiro中出现这种问题,在进行登录拦截赋予用户权限时,需要赋予用户多个角色权限,而在访问地址拦截时访问控制中当用户拥有多个角色权限的任意其一,则可以访问此页面。例如:
当前登录用户拥有admin或者isShopMan两种role中的任一个,则可以访问/userRole/**的地址,而由于shiro配置filterchaindefinitions中的roles默认的判断是&,也就是当角色同时是admin和isShopMan的时候,才可以访问此地址,所以如果在登录的时候赋予用户的角色权限是两者的中的一个的时候,当访问此页面时无论如何都是没有访问权限的。。。
那么,如何解决此问题呢?这里就需要重写过滤器用来继承AuthorizationFilter了,将里面的判断方法改变,大致方法如下:
在这里需要重写AuthorizationFilter中的isAccessAllowed方法,使其对角色判断变为拥有其一则返回true。
然后在spring的配置文件中加入如下代码:
这里使用自定义的anyRoles判断拦截,则登录绑定admin或者是isShopMan中的任意一个角色,则都可以进行拦截管理。则可以使用自定义的拦截器进行自定义拦截了。
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="filterChainDefinitions"> <value> <!-- 权限拦截 --> /userRole/**=roles[admin,isShopMan] <!-- 域名访问,未登录跳转登陆页面,已登陆根据角色跳转对应主页面 --> /=examine </value> </property> </bean>
当前登录用户拥有admin或者isShopMan两种role中的任一个,则可以访问/userRole/**的地址,而由于shiro配置filterchaindefinitions中的roles默认的判断是&,也就是当角色同时是admin和isShopMan的时候,才可以访问此地址,所以如果在登录的时候赋予用户的角色权限是两者的中的一个的时候,当访问此页面时无论如何都是没有访问权限的。。。
那么,如何解决此问题呢?这里就需要重写过滤器用来继承AuthorizationFilter了,将里面的判断方法改变,大致方法如下:
import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.authz.AuthorizationFilter; public class CustomRolesAuthorizationFilter extends AuthorizationFilter { @Override protected boolean isAccessAllowed(ServletRequest req,ServletResponse resp, Object mappedValue) throws Exception { Subject subject = getSubject(req, resp); String[] rolesArray = (String[]) mappedValue; if (rolesArray == null || rolesArray.length == 0) { //没有角色限制,有权限访问 return true; } for (int i = 0; i < rolesArray.length; i++) { if (subject.hasRole(rolesArray[i])) { //若当前用户是rolesArray中的任何一个,则有权限访问 return true; } } return false; } }
在这里需要重写AuthorizationFilter中的isAccessAllowed方法,使其对角色判断变为拥有其一则返回true。
然后在spring的配置文件中加入如下代码:
<!--自定义的Roles Filter--> <bean id="anyRoles" class="com.ssxt.ycfxf.host.filter.CustomRolesAuthorizationFilter" />
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="filterChainDefinitions"> <value> <!-- 权限拦截 --> /userRole/**=anyRoles[admin,isShopMan] <!-- 域名访问,未登录跳转登陆页面,已登陆根据角色跳转对应主页面 --> /=examine </value> </property> </bean>
这里使用自定义的anyRoles判断拦截,则登录绑定admin或者是isShopMan中的任意一个角色,则都可以进行拦截管理。则可以使用自定义的拦截器进行自定义拦截了。
相关文章推荐
- Invalid file name: must contain only [a-z0-9_.]
- Groovy DSL (1) Command chains
- pair 函数 (STL)
- 记一次foxmailQQ邮箱创建失败到解决方法
- 微软AI首席科学家:AlphaGo激发全球人工智能进入新时代
- 自动释放池工作原理,self = [super init]和定义属性时,什么时候用 assign、retain、copy 以及它们的之间的区别?
- 常用修图工具的一些使用技巧及问题解决方法——ai
- 菜鸟学算法之 POJ 3007 Organize Your Train part II
- leetcode 217. Contains Duplicate
- res\HTTPFilter.manifest : general error c1010070: Failed to load and parse the manifest. {_~
- retain/assign/strong/weak/copy/mutablecopy/autorelease区别
- hdoj A + B Again 2057 (16进制加法)
- your local repository contains non-ascii
- 迷信again
- 219. Contains Duplicate II
- 217. Contains Duplicate
- int main(int argc, char *argv[])的含义
- 成都某公司HP服务器双循环系统无法启动的RAID5数据恢复
- 217. Contains Duplicate
- 机器学习实战(三)——NaiveBayes朴素贝叶斯算法邮件分类