最近在学习shiro。
由于shiro的过滤器是与的格式,在实际编辑过滤器链的时候
/admin/** = authc,roles[admin,passenger]
本意是想admin和passenger角色都能够拥有对 /admin/** 的进行访问,但是shiro内部过滤器的逻辑是与,即同时拥有admin和passenger的角色才可以对路径进行访问。
因此,需要自己定义一个过滤器,实现或的逻辑,定义一个过滤器如下
public class CustomRolesAuthorizationFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
Subject subject = getSubject(servletRequest, servletResponse);
String[] rolesArray = (String[]) o;
//没有角色限制,有权限访问
if (rolesArray == null || rolesArray.length == 0) {
return true;
}
for (int i = 0; i < rolesArray.length; i++) {
//若当前用户是rolesArray中的任何一个,则有权限访问
if (subject.hasRole(rolesArray[i])) {
return true;
}
}
return false;
}
}
之后在sping.xml文件中将该过滤器加入IOC容器
<bean id="roleOrFilter" class="com.xcy.blog.shiro.filter.CustomRolesAuthorizationFilter"/>
然后就可以在过滤器链配置中使用
<!-- Shiro连接约束配置,即过滤链的定义 -->
<property name="filterChainDefinitions" >
<value>
/login* = anon
/admin/** = authc,roleOrFilter[admin,passenger]
</value>
</property>
注意,过滤器中使用的过滤器即为你引入IOC容器时的id。