shiro-5基于url的权限管理
2017-08-15 15:41
579 查看
1.1 搭建环境
1.1.1 数据库
mysql5.1数据库中创建表:用户表、角色表、权限表(实质上是权限和资源的结合 )、用户角色表、角色权限表。完成权限管理的数据模型创建。
1.1.2 开发环境
jdk1.7.0_72eclipse 3.7 indigo
技术架构:springmvc+mybatis+jquery easyui
1.1.3 系统工程架构
springmvc+mybatis+jquery easyui1.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
配置可以匿名访问的url1.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(资源)和权限表示方式不规范。
相关文章推荐
- 【基于url权限管理 shiro(一)】--基础
- Shiro学习笔记——(2)前奏-基于url的权限管理
- shiro教程(1)-基于url权限管理
- 【shiro】基于url的权限管理和shiro的对比
- 003-基于URL的权限管理[不使用shiro]
- shiro教程(1)-基于url权限管理
- 【基于url权限管理 shiro(二)】--权限管理解决方案
- 【基于url权限管理 shiro(一)】--基础
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 【Shiro权限管理】5. Shiro权限URL 配置细节
- 【权限管理】基于shiro的权限管理开发实现
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 基于shiro的权限管理-002授权
- 【shiro】(2)---基于RUL的权限管理
- 【迁移2016-03-28 14:53】Shiro(一):基于资源的权限管理(RBAC)
- 基于AOP实现权限管理:通过shiro认证身份和模拟授权认证
- 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。
- 基于URL的权限管理学习总结
- 【权限管理】基于shiro的权限管理开发实现
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例