shiro多权限控制访问

对于shiro对访问的控制都是一对一的,在shiro配置文件中,filterChainDefinitions里的roles的参数可以是多个。

roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

可以说这样的方式是对权限控制的and操作。
但是在很多时候,权限对功能的管理是多对一的,也就是or操作,而这样配置自带的roles多参数显然不能满足我们的需求。
于是我发现并参考了一篇博客。
原文链接
在自定义过滤器上面对权限进行控制。

CustomRolesAuthorizationFilter

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 (int i = 0; i < rolesArray.length; i++) {
            if (subject.hasRole(rolesArray[i])) {
                return true;
            }
        }
        return false;
    }
}

然后在shiro的配置文件xml中,我的是spring-mybatis-shiro.xml中将自定义的过滤器配置进去。在里面加上下面的代码。



然后修改请求路径拦截之后的处理


    
    
    
    
    
    
    
    
        
          
            
            
            
        
        
        
        
            
                /login = anon
                /logout = logout
                /test/userlogout = userlogout
                /pages/admin/** = roles[1]
                /pages/exam/** = roleOrFilter["1","3"]
                /pages/paper/** = roleOrFilter["1","3"]
                /pages/question/** = roles[1]
                /pages/set/** = roles[1]
                /pages/readover/** = roles["2"]
                /pages/message/** = roles["1"]
                /pages/** = authc
            
    

就可以将roleOrFilter来代替roles进行对权限的控制了。上面的1和2都是权限表中权限的id。

你可能感兴趣的:(shiro多权限控制访问)