使用shiro管理权限

本文只是大致说明 做个笔记, 详细叙述就不说明了
权限控制一般分为以下两种
*粗粒度权限控制: 如果用户没有登陆,则不能访问系统的功能, 如果用户登陆, 则能访问系统功能
*细粒度权限控制: 操作的权限控制或菜单的权限控制

1. 现在spring xml文件中配置需要拦截的请求或页面, 例如下图所示

先解释上图出现的权限控制说明

anon: 可以被匿名访问 即无需登陆即可访问

authc: 必须登陆后才能访问的页面

user: 经过验证的登陆(就是输入账号密码登陆), 或者经过勾选自动登录后的登陆

roles: 要求该用户需要有方括号中的角色才能访问或执行请求

roles[xxx,yyy]: 内部的xxx和yyy角色是并的关系, 要求用户拥有两个角色才能访问或执行请求

user,roles: 如果有两个 两者的关系是并, 要求用户要满足user和拥有指定角色

有了上述配置后有几个问题, 

1. 勾选记住我验证登陆后, 关闭浏览器在打开, 直接访问登陆界面, 会发现还是停留在登陆界面, 不会跳转到指定页, 如果想要满足这个需求, 需要写一个拦截登陆界面的拦截器

示例代码

@WebFilter("/landPage.jsp")
public class LandingFilter implements Filter {

    @Override
    public void destroy(){}

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        Subject currentUser = SecurityUtils.getSubject();
        /**
         * 如果满足记住我登陆的或者验证登陆的, 就跳转到指定页面
         */
        if(currentUser.isAuthenticated() || currentUser.isRemembered()) {
            //跳转到目标页面
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig fConfig) {}

}
currentUser.isAuthenticated() 验证登陆这个就为true

currentUser.isRemembered() 如果登陆勾选记住我登陆 这个就是true

2. 对于roles[xxx,yyy]需要同时满足两个角色, 但如果只要满足一个即可, 对于这个需求 需要

继承 AuthorizationFilter并重写isAccessAllowed()方法

public class RolesAuthorizationFilter extends AuthorizationFilter {

    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object mappedValue) throws Exception {
        Subject subject = getSubject(servletRequest, servletResponse);
        //配置的访问所需角色
        String[] rolesArray = (String[]) mappedValue;
        if(rolesArray == null || rolesArray.length == 0) {
            return true;
        }
        //如果有一个角色满足,则可以访问
        for(String roleName: rolesArray) {
            if(subject.hasRole(roleName)) {
                return true;
            }
        }
        return false;
    }
}
并在spring配置该bean, id属性名称必须和roles[xxx,yyy]的roles一致
<bean id="roles" class="your.package.RolesAuthorizationFilter"/>


3. 如果想以代码的形式配置下面这一块


只需要写一个factory方法

public class FilterChainDefinitionMapBuilder {

    public LinkedHashMap<String, String> buildFilterChainDefinitionMap() {
        LinkedHashMap<String, String> map = new LinkedHashMap<>();
        map.put("/landPage.jsp", "anon");
        map.put("/registerPage.jsp", "anon");
        map.put("/land", "anon");
        map.put("/register", "anon");
        map.put("/logout", "anon");
        map.put("/validate", "anon");

        map.put("/edit/*", "user,roles[teacher,admin]");
        map.put("/add", "user,roles[teacher,admin]");
        map.put("/delete/*", "user,roles[admin]");
        map.put("/**", "user");
        return map;
    }
}

xml配置如下


猜你喜欢

转载自blog.csdn.net/XlxfyzsFdblj/article/details/79297111