当前位置: 首页 > news >正文

@PreAuthorize注解

前言:RuoYi框架中,菜单管理的权限标识字段通常用于定义用户对特定菜单或操作的访问权限。

这个权限标识字段通常会被用在两个地方:

1. 后端:在Spring Security的@PreAuthorize注解中,用于控制对特定方法的访问。例如,@PreAuthorize("hasAuthority('monitor:job:add')")会在执行方法前检查用户是否具有monitor:job:add这个权限。

2. 前端:在Vue.js的v-hasPermi指令中,用于控制基于权限的UI元素的显示和隐藏。例如,v-hasPermi="['monitor:job:add']"会检查用户是否具有monitor:job:add这个权限,如果有,那么相关的UI元素就会显示。

通过这种方式,RuoYi框架可以实现精细的基于权限的访问控制,确保只有具有相应权限的用户才能访问特定的资源。

详细整理如下:

 当用户登录系统的时候,会调用getInfo接口,在该接口中会将用户、权限、角色等集合信息返回给前端。

 获取用户信息:

从request请求中,获取token进而获取用户信息

LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());

获取角色集合:

根据userId获取当前用户角色集合

Set<String> roles = roleService.selectRolePermissionByUserId(user.getUserId());

 核心的sql语句 匹配出当前用户拥有哪些角色

 select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope,r.status, r.del_flag, r.create_time, r.remark from sys_role rleft join sys_user_role ur on ur.role_id = r.role_idleft join sys_user u on u.user_id = ur.user_idleft join sys_dept d on u.dept_id = d.dept_idWHERE r.del_flag = '0' and ur.user_id = #{userId}

 获取权限集合:

 通过user对象获取当前用户的权限集合

Set<String> permissions = permissionService.getMenuPermission(user);

 核心sql语句 通过userId获取当前用户所有角色的所有权限

select distinct m.permsfrom sys_menu mleft join sys_role_menu rm on m.menu_id = rm.menu_idleft join sys_user_role ur on rm.role_id = ur.role_idleft join sys_role r on r.role_id = ur.role_idwhere m.status = '0' and r.status = '0' and ur.user_id = #{userId}

@PreAuthorize注解工作流程

用户此时已经登陆系统,假设用户操作的是角色管理模块的查询按钮,当点击该按钮时,会通过网络映射到后端的接口方法。

当这个请求到达被@PreAuthorize注解的方法时,Spring Security的拦截器会拦截这个请求。

拦截器会获取到@PreAuthorize注解中的表达式,并使用Spring EL表达式语言对其进行求值。这个过程通常会涉及到当前用户的认证信息,例如用户的角色、权限等。根据表达式的求值结果,Spring Security会做出访问控制决策。如果表达式求值为true,那么请求会被允许继续执行;如果表达式求值为false,那么请求会被拒绝,通常会返回一个HTTP 403 Forbidden错误。

@PreAuthorize("@ss.hasPermi('system:role:list')")@GetMapping("/list")public TableDataInfo list(SysRole role){startPage();List<SysRole> list = roleService.selectRoleList(role);return getDataTable(list);}
 /*** 验证用户是否具备某权限* * @param permission 权限字符串* @return 用户是否具备某权限*/public boolean hasPermi(String permission){if (StringUtils.isEmpty(permission)){return false;}LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())){return false;}return hasPermissions(loginUser.getPermissions(), permission);}

如果当前用户的权限集合中,包含当前被@PreAuthorize标注的方法的权限,则返回true。

 /*** 判断是否包含权限* * @param permissions 权限列表* @param permission 权限字符串* @return 用户是否具备某权限*/private boolean hasPermissions(Set<String> permissions, String permission){return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));}

如果请求被允许继续执行,那么被@PreAuthorize注解的方法会被调用。

相关文章:

  • 语境化语言表示模型-ELMO、BERT、GPT、XLnet
  • 为什么很多公司选择不升级JDK版本,仍然使用JDK8?
  • Transformer - Attention is all you need 论文阅读
  • 地质时间与数值模拟时间转换(mm/Ma-->m/s)
  • 【大数据】Flink 详解(十):SQL 篇 Ⅲ
  • 源码编译FFmpeg4.3
  • 有趣的事,讲给有趣的人听
  • dns 域名解析
  • java常见面试题:如何使用Java进行单元测试?
  • ES6(ECMAScript 6.0)
  • Python 常用模块pickle
  • 什么是云服务器ECS及其优势、购买、使用方式和部署建议
  • 操作系统-操作系统的概念和功能
  • Harbor离线安装
  • 建筑垃圾处理行业分析:正在被越来越广泛的运用
  • 【RocksDB】TransactionDB源码分析
  • If…else
  • JavaScript 一些 DOM 的知识点
  • javascript从右向左截取指定位数字符的3种方法
  • markdown编辑器简评
  • Node + FFmpeg 实现Canvas动画导出视频
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue实战(四)登录/注册页的实现
  • 基于Android乐音识别(2)
  • 基于web的全景—— Pannellum小试
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 入口文件开始,分析Vue源码实现
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我这样减少了26.5M Java内存!
  • 异步
  • 优秀架构师必须掌握的架构思维
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #include<初见C语言之指针(5)>
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (10)STL算法之搜索(二) 二分查找
  • (175)FPGA门控时钟技术
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)hibernate配置管理
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (五)c52学习之旅-静态数码管
  • (一)80c52学习之旅-起始篇
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net 4.0并行库实用性演练
  • .Net IE10 _doPostBack 未定义
  • .Net Web项目创建比较不错的参考文章
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET程序员迈向卓越的必由之路
  • :=
  • :中兴通讯为何成功
  • @Valid和@NotNull字段校验使用
  • []T 还是 []*T, 这是一个问题
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BZOJ3757] 苹果树