@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 r
	        left join sys_user_role ur on ur.role_id = r.role_id
	        left join sys_user u on u.user_id = ur.user_id
	        left join sys_dept d on u.dept_id = d.dept_id
        WHERE r.del_flag = '0' and ur.user_id = #{userId}

 获取权限集合:

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

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

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

select distinct m.perms
		from sys_menu m
			 left join sys_role_menu rm on m.menu_id = rm.menu_id
			 left join sys_user_role ur on rm.role_id = ur.role_id
			 left join sys_role r on r.role_id = ur.role_id
		where 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注解的方法会被调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 异步编程解决方案-中篇

天下事有难易乎&#xff1f; 为之&#xff0c;则难者亦易矣&#xff1b;不为&#xff0c; 则易者亦难矣。人之为学有难易乎&#xff1f; 学之&#xff0c;则难者亦易矣&#xff1b;不学&#xff0c;则易者亦难矣。 async 函数 和promise then的规则一样 async function fun() …

ORA-12541:TNS:无监听程序

1.重新配置监听 找到监听程序配置&#xff0c;右键已管理员身份运行 选择第二个&#xff1a;重新配置 这个一般没什么好选的 默认选定的协议TCP&#xff0c;继续下一步 默认的否 继续下一步&#xff0c;完成监听重新配置 之后进行测试看能否连上 2.本地Net服务名配置 …

HTML--表格

表格的基本结构 表格标题&#xff1a;caption 表格&#xff1a;table标签 行&#xff1a; tr标签 单元格&#xff1a;td标签 语法&#xff1a; <!DOCTYPE html> <html> <head> <title>这是一个标题</title><meta charset"utf-8"/&…

Nacos服务注册或发现、Nacos服务分级模型、Nacos负载均衡策略、加权负载均衡、Nacos环境隔离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nacos服务搭建&#xff0c;nacos服务注册或发现二、Nacos服务分级模型三、Nacos负载均衡策略四、Nacos注册中心&#xff08;nacos控制台配置&#xff09;-加…

初识Spring

1.Spring官网&#xff1a; 2.官网学习的顺序&#xff1a;先学Spring,再学SpringBoot,然后SpringCloud,Spring Cloud Data Flow。 3.Spring Framework界面&#xff1a; 4.github上的源代码&#xff1a; 5.进入使用说明文档&#xff1a; 主要是根据这个进行学习的。 6.我们用mave…

Vue2.脚手架

全局安装&#xff1a;npm i vue/cli -g检查是否成功安装&#xff1a;vue --version新建项目&#xff1a;vue create 项目名 通过nodejs安装的时候&#xff0c;可以直接代理和仓库&#xff0c;~/.npmrc文件内容如下&#xff1a; proxysocks5://127.0.0.1:7897 registryhttps:/…

QT周五作业

题目&#xff1a;实现简单水果的价格重量计算 点击一次水果重量1 自动计算总价 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QListWidgetItem> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

未来科技五年人工智能行业产业发展趋势最新竞争力

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是近年来快速发展的热门领域&#xff0c;被广泛应用于各个行业。随着技术的不断创新和突破&#xff0c;人工智能行业的竞争力也在不断提升。本文将分析未来科技五年人工智能行业产业发展趋势&#xff0c…

“一键倒放,创意无限!让视频剪辑成为艺术“

你是否厌倦了常规的视频播放方式&#xff0c;想要寻找一种全新的、与众不同的方式来呈现你的视频内容&#xff1f;现在&#xff0c;我们为你带来一个革命性的工具&#xff0c;让你轻松实现视频批量倒放&#xff0c;激发无限创意&#xff01; 第一步。首先&#xff0c;我们要打…

基于SpringBoot的康复中心管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

第十七周周报

文章目录 摘要目标检测锚框交并比NMS 非极大值抑制输出 文献阅读&#xff1a;SMPL: A Skinned Multi-Person Linear ModelIntroductionRelated WorkModel FormulationTraining评估动态SMPL讨论结论 总结 摘要 本周看了三维人体重建的领域&#xff0c;看了一篇SMPL的文章&#…

Windows2012部署项目

目录 1.jdk的安装 2.Tomact安装 3.MySQL安装 4.项目部署 ​5.思维导图 1.jdk的安装 将jdk从主机复制到虚拟机里面&#xff0c;然后双击进行安装 安装完JDK之后&#xff0c;在系统的高级系统设置中点击环境变量&#xff0c;进行增加系统变量 变量名 : JAVA_HOME 变量值 : …

【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)

盲点问题解析之HashMap工作原理全揭秘 承接上文创建HashMap对象参考容量&#xff08;capacity&#xff09;Hashmap内部有一个机制扩容阈值&#xff08;threshold&#xff09;负载因子&#xff08;loadFactor&#xff09; HashMap存储元素的过程HashMap的put方法JDK8的扩容机制N…

一键批量翻译,文件夹名称翻译器

文件夹名称往往是我们初步了解文件内容的重要窗口。有时&#xff0c;为了更好地与国际合作伙伴交流或是管理个人文件&#xff0c;我们需要对文件夹名称进行翻译。传统的逐一修改方法既费时又费力&#xff0c;还要借助翻译工具。现在有了【文件批量改名高手】&#xff0c;上面的…

OpenAI ChatGPT-4开发笔记2024-06:最简Embedding

Embedding embedding直译是&#xff1a;嵌入。和实际意思有些差距。其实就是把文本转换为向量表示的过程。用“向量化”更直接&#xff0c;但这又和tensor有点儿混。它是变成向量的一个过程。 embedding 的应用领域&#xff1a; 文本分类&#xff1a; 将文本嵌入转换为向量后…

js逆向第20例:猿人学第19题乌拉乌拉乌拉

文章目录 一、前言二、定位关键参数1、JA3/TLS指纹怎么查看2、加密值长度对比三、代码实现四、参考文献一、前言 任务十九:抓取这5页的数字,计算加和并提交结果 此题在以前用python写逆向代码是存在缺陷的,直到今年有个大佬开源了curl_cffi库,并且支持 JA3/TLS 和 http2 指…

提交代码,SVN被锁定,提示:svn is already locked解决方案

今天遇到一个问题&#xff0c;svn 在提交代码的时候出现了svn is already locked&#xff0c;解决方案如下图 点击clean up 点击ok即可 来看官方对clean up的解释&#xff1a;它的作用就是查找工作拷贝中的所有遗留的日志文件&#xff0c;删除进程中工作拷贝的锁。 参考&…

也谈人工智能——AI科普入门

文章目录 1. 科普入门人工智能的定义人工智能的类型 - 弱 AI 与强 AI人工智能、深度学习与机器学习人工智能的应用和使用场景语音识别计算机视觉客户服务建议引擎数据分析网络安全 行业应用人工智能发展史![img](https://img-blog.csdnimg.cn/img_convert/66aeaaeac6870f432fc4…

网络安全B模块(笔记详解)- MYSQL信息收集

MYSQL信息收集 1.通过渗透机场景Kali中的渗透测试工具对服务器场景MySQL03进行服务信息扫描渗透测试(使用工具Nmap,使用必须要使用的参数),并将该操作显示结果中数据库版本信息作为Flag提交; Flag:MySQL 5.5.12 2.通过渗透机场景Kali中的渗透测试工具对服务器场景MySQL0…

【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习

文章目录 RV1126芯片介绍rv1126 模块代码目录相关说明 SDK 包下的脚本使用build.sh 脚本使用envsetup.sh 脚本使用mkfirmware.sh 脚本使用rkflash.sh 脚本使用 U-Boot 编译和配置uboot 的配置修改编译操作 kernel 的修改编译rootfs 编译和配置buildroot 配置busybox 配置 固件打…