博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shiro-5基于url的权限管理
阅读量:7079 次
发布时间:2019-06-28

本文共 3932 字,大约阅读时间需要 13 分钟。

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 编写认证拦截器

//用于用户认证校验、用户权限校验@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//得到请求的urlString url = request.getRequestURI();//判断是否是公开 地址//实际开发中需要公开 地址配置在配置文件中//从配置中取逆名访问urlList
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
open_urls = ResourcesUtil.gekeyList("anonymousURL"); //遍历公开 地址,如果是公开 地址则放行 for(String open_url:open_urls){ if(url.indexOf(open_url)>=0){ //如果是公开 地址则放行 return true; } } //从配置文件中获取公共访问地址 List
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
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(资源)和权限表示方式不规范。

 

转载地址:http://uopml.baihongyu.com/

你可能感兴趣的文章
获取网页数据的例子
查看>>
struts2的配置文件
查看>>
JSP第5次测试---测试分析
查看>>
tomcat容器
查看>>
同时可以修改时间和日期的datetime_select and 有关时间的转换
查看>>
IOS Orientation, 想怎么转就怎么转~~~
查看>>
Finding Lines
查看>>
服务提供者及门面
查看>>
POJ-1611-The Suspects(并查集)
查看>>
用VC生成 IDispatch 包装类
查看>>
xcode5.1上真机调试报告No architectures to compile for...的解决办法
查看>>
算法导论读书笔记-第十四章-数据结构的扩张
查看>>
HttpClient使用详解
查看>>
char、varchar、nchar、nvarchar的区别
查看>>
锐捷、赛尔认证MentoHUST
查看>>
前后台传值 201...
查看>>
POJ 2133 暴搜
查看>>
BZOJ 1379 模拟退火
查看>>
MSDN中关于COM教程编译参数的修改
查看>>
一个js验证类
查看>>