zoukankan      html  css  js  c++  java
  • shiro-5基于url的权限管理

    1.1 搭建环境

    1.1.1 数据库

    mysql5.1数据库中创建表:用户表、角色表、权限表(实质上是权限和资源的结合 )、用户角色表、角色权限表。

        

    完成权限管理的数据模型创建。

        

    1.1.2 开发环境

    jdk1.7.0_72

    eclipse 3.7 indigo 

    技术架构:springmvc+mybatis+jquery easyui

    1.1.3 系统工程架构

    springmvc+mybatis+jquery easyui

        

    1.1.4 系统登陆

    系统 登陆相当 于用户身份认证,用户成功,要在session中记录用户的身份信息.

    操作流程:

    用户进行登陆页面

    输入用户名和密码进行登陆

    进行用户名和密码校验

    如果校验通过,在session记录用户身份信息

    1.1.1.1 用户的身份信息

    创建专门类用于记录用户身份信息。

        

    1.1.1.2 mapper

    mapper接口: 根据用户账号查询用户(sys_user)信息(使用逆向工程生成的mapper

    使用逆向工程生成以下表的基础代码:

        

    1.1.1.3 service(进行用户名和密码校验)

    接口功能:根据用户的身份和密码 进行认证,如果认证通过,返回用户身份信息

    认证过程:

    根据用户身份(账号)查询数据库,如果查询不到用户不存在

    对输入的密码 和数据库密码 进行比对,如果一致,认证通过

         

    1.1.1.4 controller(记录session

        

    1.1.1 用户认证拦截器

    1.1.1.1 anonymousURL.properties

    配置可以匿名访问的url

        

    1.1.1.2 编写认证拦截器

    //用于用户认证校验、用户权限校验
    @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;
    }
    }
    //判断用户身份在session中是否存在
    HttpSession session = request.getSession();
    ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
    //如果用户身份在session中存在放行
    if(activeUser!=null){
    return true;
    }
    //执行到这里拦截,跳转到登陆页面,用户进行身份认证
    request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
    //如果返回false表示拦截不继续执行handler,如果返回true表示放行
    return false;
    }

    1.1.1.3 配置拦截器

    springmvc.xml中配置拦截器

         

    1.1.2 授权

    1.1.2.1 commonURL.properties

    在此配置文件配置公用访问地址,公用访问地址只要通过用户认证,不需要对公用访问地址分配权限即可访问。

    1.1.2.2 获取用户权限范围的菜单

    思路:

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

        

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

        

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

        

    1.1.2.3 获取用户权限范围的url

    思路:

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

        

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

        

        

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

        

    1.1.2.4 用户认证通过取出菜单和url放入session

      

    修改service认证代码:

        

    1.1.2.5 菜单动态显示

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

        

    1.1.2.6 授权拦截器

        

    //在执行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.2.7 配置授权拦截器

    注意:将授权拦截器配置在用户认证拦截的下边。

        

    1.1 小结

    只保护到菜单,页面里面的 操作没有权限管控,那么有人直接在浏览器输入这个地址即可进入这个页面。

    使用基于url拦截的权限管理方式,实现起来比较简单,不依赖框架不用spring的拦截器也可以,使用web提供filter就可以实现。目前也是基于资源,但是不够细。

    问题:

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

  • 相关阅读:
    jenkins更换国内源
    jenkins修改初始密码
    jenkins常用插件
    jenkins安装
    ResNet几种变体,以及DenseNet解释
    预测某个位置使用全局特征和使用周围特征的区别
    SPP Net作用
    yolov3 size说明,shortcut残差
    F.pad说明 用于pad操作
    自己的yolov3模型创建全流程
  • 原文地址:https://www.cnblogs.com/rogge7/p/7365448.html
Copyright © 2011-2022 走看看