您的位置:首页 > 其它

shiroFilter配置文件详解关于默认的and关系改为or

2016-09-24 20:01 465 查看
由于shiro默认对于角色授权的拦截是and关系,只有当该用户拥有配置的一个多个角色是才可通过

/user/add = roles["admin,test"]
当该角色同时拥有这两个角色时才可进入user/add的页面中

这显然是不够我们使用的,但是我们可以自定义一个filter实现or关系

自定义的shiroOrFilter如下

/**
* 自定义校验规则(or)
* 只要满足其中一个角色即可了
*/
public class CustomRolesAuthorizationFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest request,
ServletResponse response, Object mappedValue) throws Exception {
Subject subject = getSubject(request, response);
String[] rolesArray = (String[]) mappedValue;

if (rolesArray == null || rolesArray.length == 0) {
return true;
}
for (String aRolesArray : rolesArray) {
if (subject.hasRole(aRolesArray)) {
return true;
}
}
return false;
}
}
shiro配置中这样写

<pre name="code" class="java"><!-- 因为shiro的角色控制在shiroFilter需要满足and逻辑,此处我们自定义一个满足or逻辑的-->
<bean id="cRole" class="gcu.shiro.CustomRolesAuthorizationFilter" />
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" depends-on="cRole">
<property name="loginUrl" value="/user/index"/>
<property name="securityManager" ref="securityManager"/>
<property name="unauthorizedUrl" value="/user/noAuthority"/>
<property name="filters">
<map>
<entry key="cRole" value-ref="cRole"/>
</map>
</property>
<property name="filterChainDefinitions">
<value>
/css/** = anon
/font/** = anon
/images/** = anon
/js/** = anon
/user/index = anon
/user/login = anon

/**/add = cRole["ADMIN,SUPER"]
/**/list = cRole["ADMIN,SUPER"]

/**/edit/**= cRole[SUPER]
/**/del/**= cRole[SUPER]

/** = authc
</value>
</property>
</bean>



此处要注意,之前的roles要被cRole所替代,否则过滤不成功
/user/add = cRole["admin,test"]
</pre><pre code_snippet_id="1898542" snippet_file_name="blog_20160924_7_7731479" name="code" class="java">
此时只要满足一个角色就可以访问了


shiro 最基本的demo 实现了权限、角色、等的管理。但没有使用本文介绍的角色问题,此demo权限更加细粒化

shiro demo https://github.com/haois/shiro-rbac-demo.git(spring
springmvc mybatis maven)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: