shiro2

mapper接口:根据用户id查询用户权限的菜单

service接口:根据用户id查询用户权限的菜单

获取用户权限范围的url

思路:

在用户认证时,认证通过,根据用户id从数据库获取用户权限范围的url,将url的集合存储在session中。

mapper接口:根据用户id查询用户权限的url

service接口:根据用户id查询用户权限的url

用户认证通过取出菜单和url放入session
修改service认证代码:

菜单动态显示
修改first.jsp,动态从session中取出菜单显示:

授权拦截器
//在执行handler之前来执行的
    //用于用户认证校验、用户权限校验
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        
        //得到请求的url
        String url = request.getRequestURI();
        
        //判断是否是公开 地址
        //实际开发中需要公开 地址配置在配置文件中
        //从配置中取逆名访问url
        
        List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");
        //遍历公开 地址,如果是公开 地址则放行
        for(String open_url:open_urls){
            if(url.indexOf(open_url)>=0){
                //如果是公开 地址则放行
                return true;
            }
        }
        
        //从配置文件中获取公共访问地址
        List<String> common_urls = ResourcesUtil.gekeyList("commonURL");
        //遍历公用 地址,如果是公用 地址则放行
        for(String common_url:common_urls){
            if(url.indexOf(common_url)>=0){
                //如果是公开 地址则放行
                return true;
            }
        }
        
        //获取session
        HttpSession session = request.getSession();
        ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
        //从session中取权限范围的url
        List<SysPermission> permissions = activeUser.getPermissions();
        for(SysPermission sysPermission:permissions){
            //权限的url
            String permission_url = sysPermission.getUrl();
            if(url.indexOf(permission_url)>=0){
                //如果是权限的url 地址则放行,否则跳转拒绝页面。
                return true;
            }
        }
        
        //执行到这里拦截,跳转到无权访问的提示页面
        request.getRequestDispatcher("/WEB-INF/jsp/refuse.jsp").forward(request, response);
        
        //如果返回false表示拦截不继续执行handler,如果返回true表示放行
        return false;
    }
配置授权拦截器
注意:将授权拦截器配置在用户认证拦截的下边。

1.1 小结

使用基于url拦截的权限管理方式,实现起来比较简单,不依赖框架,使用web提供filter就可以实现。

问题:

需要将所有的url全部配置起来,有些繁琐,不易维护,url(资源)和权限表示方式不规范。

posted @ 2018-04-07 18:11  无天666  阅读(284)  评论(0编辑  收藏  举报