【shiro】(2)---基于RUL的权限管理

2023-11-22 14:59
文章标签 管理 权限 shiro rul

本文主要是介绍【shiro】(2)---基于RUL的权限管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于RUL的权限管理

     我想在写shiro权限管理认证前,先来一个基于URL实现的权限管理控制。

一、基于URI的权限业务逻辑

   实现思路:
       将系统操作的每个url配置在权限表中,将权限对应到角色将角色分配给用户用户访问系统功能通过Filter进行过虑过虑器获取到用户访问的url只要访问的url是用户分配角色中的url则放行继续访问
具体逻辑看下面一张表。

 

 二、环境搭建(数据表)

   思维已经清晰,接下来通过代码来实现具体业务逻辑。
   开发环境
          JDK1.8
          Eclipse
          Maven
   技术架构:SpringMVC+Mybatis+jQuery easyUI

数据库

    MySQL数据库中创建表:用户表、角色表权限表(实质是权限和资源的结合)、用户角色关系表、角色权限关系表

(1)具体表

  sys_user  用户表(这里明文密码都是:111111)

 

  sys_role  角色表

 

  sys_user_role 权限表

 

sys_permission 权限表

 

 sys_role_permission  角色权限关系表

 

 

三、用户认证

   1.login.action用户登录页面

<BODY ><FORM id="loginform" name="loginform" action="?loginsubmit.action"method="post"><TABLE class="tab" border="0" cellSpacing="6" cellPadding="8"><TBODY><TR><TD>用户名:</TD><TD colSpan="2"><input type="text" id="usercode"name="usercode" style="WIDTH: 130px" /></TD></TR><TR><TD>密 码:</TD><TD><input type="password" id="pwd" name="password" style="WIDTH: 130px" /></TD></TR><TR><TD>验证码:</TD><TD><input id="randomcode" name="randomcode" size="8" /> <imgid="randomcode_img" src="${baseurl}validatecode.jsp" alt=""width="56" height="20" align='absMiddle' /> <ahref=javascript:randomcode_refresh()>刷新</a></TD></TR><TR><TD colSpan="2" align="center"><input type="sumbit"value="登 录" /></TD></TR></TBODY></TABLE></FORM>
</BODY>
login.jsp

   2、SpringMVC配置过滤器

<!-- 用户身份校验的拦截器 --><mvc:interceptor><mvc:mapping path="/**" /><bean class="com.jincou.controller.interceptor.LoginInterceptor"></bean></mvc:interceptor>

3、LoginInterceptor过滤器

public class LoginInterceptor implements HandlerInterceptor {// 在进入controller方法之前执行// 进行身份认证校验拦截,如果拦截不放行,controller方法不再执行
    @Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {// 校验用户访问是否是公开资源地址(无需认证即可访问)List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");// 用户访问的url(这里用户登录页面login.action,和登录提交页面loginsubmit.action属于公开访问页面,直接发行)String url = request.getRequestURI();for (String open_url : open_urls) {if (url.indexOf(open_url) >= 0) {// 如果访问的是公开 地址则放行return true;}}// 校验用户身份是否认证通过HttpSession session = request.getSession();ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");if (activeUser != null) {// 用户已经登陆认证,放行return true;}// 跳转到登陆页面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);return false;}}

(1)anonymousURL.properties配置文件

#不需要登录就可以访问的页面:比如登录页面,登陆提交的地址,网站首页等
login.action=登录页面
loginsubmit.action=登陆提交按钮的地址
配置文件

4、LoginControl控制层

/*** 获得用户名,密码,验证码进行用户验证,验证通过就把该用户放到session中*/
@Controller
public class LoginController {@Autowiredprivate SysService sysService ;//用户登陆提交@RequestMapping("/loginsubmit")public String loginsubmit(HttpSession session,String usercode,String password,String randomcode) throws Exception{//校验验证码//从session获取正确的验证码(因为验证码是从前端生成,传到后端)String validateCode = (String)session.getAttribute("validateCode");if(!randomcode.equals(validateCode)){//抛出异常:验证码错误throw new CustomException("验证码 错误 !");}//用户身份认证ActiveUser activeUser = sysService.authenticat(usercode, password);//记录sessionsession.setAttribute("activeUser", activeUser);return "redirect:first.action";}
}

   4.1ActiveUser实体类

/*** 用户身份信息,获取通过用户名得到密码和菜单和页面权限*/
public class ActiveUser implements java.io.Serializable {/*** */private static final long serialVersionUID = 1L;private String userid;//用户idprivate String usercode;// 用户账号private String username;// 用户名称private List<SysPermission> menus;// 菜单private List<SysPermission> permissions;// 权限//set和get方法
}
ActiveUser

 5.SysServiceImpl实现类

//@Overridepublic ActiveUser authenticat(String usercode, String password)throws Exception {//账号和密码非空校验 //....
        SysUserExample sysUserExample = new SysUserExample();SysUserExample.Criteria criteria = sysUserExample.createCriteria();criteria.andUsercodeEqualTo(usercode);List<SysUser> userList = sysUserMapper.selectByExample(sysUserExample);if(userList == null || userList.size()<=0){throw new CustomException("账号不存在!");}SysUser sysUser = userList.get(0);//密码 String password_fromdb = sysUser.getPassword();//输入 密码 和数据库密码 比较(因为数据库加过密所以这里也加密后进行比较)if(!password_fromdb.equalsIgnoreCase(new MD5().getMD5ofStr(password))){throw new CustomException("账号或密码 错误 !");}//认证通过,返回用户身份ActiveUser activeUser = new ActiveUser();activeUser.setUserid(sysUser.getId());activeUser.setUsername(sysUser.getUsername());activeUser.setUsercode(sysUser.getUsercode());//菜单列表List<SysPermission> menus = sysPermissionMapperCustom.findMenuByUserid(sysUser.getId());activeUser.setMenus(menus);//权限列表List<SysPermission> permissions = sysPermissionMapperCustom.findPermissionByUserid(sysUser.getId());activeUser.setPermissions(permissions);//获得用户菜单和权限列表return activeUser;}

总结:     

用户认证的思路很简单:
(1)判断用户登录是否成功,成功将用户信息放入session中,登录后点击其它页面,过滤器会看session是否存在用户,存在则放行。
(2)如果你没有登录,点击其它非公共页面,那过滤器会发现session中没有用户信息,则跳转到登录页面。

 

 三、权限管理

    既你登录认证通过后,根据用户id从数据库中获取用户权限范围的URL,将URL的集合存储在activeUser中并存在session中。

     1.springMVC配置权限认证过滤器

<!-- 用户登陆成功后的资源权限拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.jincou.controller.interceptor.PermissionInterceptor"></bean>
</mvc:interceptor>

      2、PermissionInterceptor过滤器

public class PermissionInterceptor implements HandlerInterceptor {// 在进入controller方法之前执行// 用户权限拦截,如果拦截不放行,controller方法不再执行// 进入action方法前要执行
    @Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {// TODO Auto-generated method stub// 用户访问地址:String url = request.getRequestURI();// 校验用户访问是否是公开资源地址(无需认证即可访问)List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");// 用户访问的urlfor (String open_url : open_urls) {if (url.indexOf(open_url) >= 0) {// 如果访问的是公开 地址则放行return true;}}//从 session获取用户公共访问地址(认证通过无需分配权限即可访问)List<String> common_urls = ResourcesUtil.gekeyList("commonURL");// 用户访问的urlfor (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> permission_list = activeUser.getPermissions();// 校验用户访问地址是否在用户权限范围内for (SysPermission sysPermission : permission_list) {String permission_url = sysPermission.getUrl();if (url.contains(permission_url)) {return true;}}// 跳转到无权访问页面request.getRequestDispatcher("/refuse.jsp").forward(request, response);return false;}}

   (1)commonURL配置文件

#用户公共访问地址指的是用户登录后,有些页面也是不需要配置权限的,每个用户都会有的页面:比如:个人中心,退出页面等first.action=系统页面logout.action=退出页面
配置文件

总结:   

权限认证的思路:
   (1)当用户登录成功后,因为上面ActiveUser对象,里面有用户可以访问哪些菜单,所以页面也只会显示这些菜单。
   (2)当我用户浏览我没有权限的URL页面,那么PermissionInterceptor会判断我没有这个页面的权限,直接调整到无权访问页面。

 

四、一些细节

1、前段页面是如何做到当前用户可以获得哪些菜单(可以循环遍历)

<c:if test="${activeUser.menus!=null }">    <c:forEach items="${activeUser.menus }" var="menu"><a href="${pageContext.request.contextPath }/${menu.url }" >${menu.name }</a>        </c:forEach>
</c:if> 

2、验证下"zhangsan"用户能看到的菜单是否正确

(1)先看没有做权限页面的菜单

 

(2)再看做了权限管理的页面

(3)那到底是不是这样?(数据查询正确)

  

 github地址: https://github.com/yudiandemingzi/URLquanxian

 

想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。少校【3】

转载于:https://www.cnblogs.com/qdhxhz/p/9147326.html

这篇关于【shiro】(2)---基于RUL的权限管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410952

相关文章

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖: