springSecurity权限控制

权限控制:不同的用户可以使用不同的功能。

我们不能在前端判断用户权限来控制显示哪些按钮,因为这样,有人会获取该功能对应的接口,就不需要通过前端,直接发送请求实现功能了。所以需要在后端进行权限判断。(前端防君子,后端防小人。

授权流程:springSecurity会默认使用FilterSecurityInterceptor进行权限校验,会从SecurityContextHolder中获取authentication,获取权限信息进行判断。

所以需要我们做的就是把用户的权限信息存入authentication。

那么SecurityContextHolder中的权限信息是从哪里获取的呢,前面SecurityContextHolder中的认证用户信息是从redis中获取的,权限信息也一样。

我们先说说权限控制的方案:1、springSecurity提供注解;2、配置

注解权限控制是我们经常用的,我就只说这个方案了。

使用权限控制注解,需要在SecurityConfig配置类中开启配置:

@EnableGlobalMethodSecurity(prePostEnabled = true)

@Configuration
//开启权限控制注解
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {.....
}

我们能用的权限控制注解有很多,但真正经常用的只有@PreAuthorize就是在访问之前进行权限判断。写在controller层的请求方法上。

@PreAuthorize("hasAuthority('test')")

这里其实是去调用hasAuthority方法去判读权限,返回true即有权限。test为权限名

@RestController
@RequestMapping
public class HelloController {@GetMapping("/hello")//这里其实是去调用hasAuthority方法去判读权限,返回true即有权限.test为权限名,这里只能填一个权限@PreAuthorize("hasAuthority('test')")public String hello(){return "hello";}

至于 权限名的定义和权限内容的定义 在后面定义。

注解类方法:

@PreAuthorize("hasAuthority('权限名')")

除了前面用的hasAuthority方法外,还有其他的校验方法,当然我们也可以自定义校验方法。

  hasAuthority(‘’)方法:只能填一个权限。

  hasAnyAuthority(‘’,’’,’’)方法:可以传入多个权限,其中用户有任意一个权限都可以访问。

  hasRole(‘’)方法:要求有对应角色才可以访问。它内部会把我们传入的角色参数拼接上 ROLE_ 后在去比较,所以需要对用户的权限也要有 ROLE_ 这个前缀。

  hasAnyRole(‘’,’’,’’)方法:要求有对应任意角色才可以访问。它内部也会把我们传入的角色参数拼接上 ROLE_ 后在去比较,所以需要对用户的权限也要有 ROLE_ 这个前缀。

同时权限是实体类User类的属性:

@Data
@NoArgsConstructor
//@AllArgsConstructor
public class LoginUser implements UserDetails {//需要定义User对象来封装用户信息。private User user;//该用户的权限信息private List<String> permissions;public LoginUser(User user, List<String> permissions) {this.user = user;this.permissions = permissions;}//问题:当我们把logUser存入redis中时,redis默认不会把SimpleGrantedAuthority对象序列化。//解决:我们不需要把SimpleGrantedAuthority存入redis,我们只需把权限信息permissions存入即可//通过permissions反序列化即可获取authorities,所以需要忽略SimpleGrantedAuthority,不要对它序列化@JSONField(serialize = false)private List<SimpleGrantedAuthority> authorities;@Override //实际springSecurity获取权限信息是调用的该方法,重写该方法。public Collection<? extends GrantedAuthority> getAuthorities() {//优化:如果每次获取权限都进行集合转换,有点浪费。我们只第一次去集合转换,后续获取直接返回之前转换好的//即把List<SimpleGrantedAuthority> authorities定义为成员变量。if(authorities!=null){return authorities;}authorities = permissions.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());return authorities;}
}

然后去数据库中查询用户权限:

到数据库中查询权限信息:

RBAC权限模型(Role-Based Access Control):基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。

在数据库中,我们会创建一个用户表,一个权限表(记录着权限功能说明和权限名),一个用户可以有多个权限,不好表达,所以我们又引入了一个角色表,里面有很多角色,在创建个角色权限管理表,每种角色对应不同的多种功能,为角色赋予不同的权限。比如:图书馆管理系统中的角色:图书管理员(权限:添加、查询、删除等等);借阅者(权限:查询、借阅)。同时,一个用户可能会有多种身份,需要将用户与角色关联起来。

这就是RBAC模型(最少都是5张表)

5表联合查询用户权限:role为角色表,menu为菜单表(可以理解为权限表) 

<mapper namespace="org.example.springSecurity.mapper.MenuMapper"><select id="selectPermsByUserId" resultType="java.lang.String">selectdistinct m.permsfrom sys_user_role urLeft join `sys_role` r on ur.role_id = r.idLeft join `sys_role_menu` rm on ur.role_id = rm.role_idLeft join `sys_menu` m on m.id = rm.menu_idwhereuser_id = #{userId}and r.status = 0and m.status = 0</select>
</mapper>

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++笔记】map和set的使用

前言 各位读者朋友们大家好&#xff01;上期我们讲完了二叉搜索树这一数据结构&#xff0c;这一期我们来讲STL中的map和set这两大容器。这两个容器的底层是红黑树&#xff0c;红黑树的底层是平衡二叉搜索树。 目录 前言一. 序列式容器和关联式容器二. set系列的使用2.1 set类…

IO进程学习笔记

man手册 普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量 IO介绍 I&#xff1a;input 输入 O&#xff1a;output 输出 对文件的输入和输出 输入-》写文件&#xff0c;将文件中的内容写到内存中去 输出-》读文件&#xff0c;将内存中的内容读取到文…

基于STM32的手势电视机遥控器设计

目录 引言系统设计 硬件设计软件设计系统功能模块 手势识别模块遥控信号发送模块控制接口模块控制算法 手势识别算法遥控信号映射算法代码实现 手势识别与处理遥控信号发送系统调试与优化结论与展望 1. 引言 随着智能家居和物联网技术的发展&#xff0c;传统的电视遥控器逐渐…

哈希表实现

哈希概念 哈希&#xff08;hash&#xff09;又称散列&#xff0c;是一种组织数据的方式。从译名来看&#xff0c;有散乱排列的意思。本质就是通过哈希函数把关键字 Key 跟存储位置建立一个映射关系&#xff0c;查找时通过这个哈希函数计算出 Key 存储的位置&#xff0c;进行快…

CSS学习记录08

CSS文本颜色 文本颜色 color属性用于设置文本的颜色&#xff0c;颜色由以下值指定&#xff1a; 颜色名-比如“red"十六进制值-比如”#ff0000"RGB值-比如&#xff1a;“rgb&#xff08;255,0,0)”等。 页面的默认文本颜色在body选择器中定义的。 body {color: bl…

电子商务人工智能指南 6/6 - 人工智能生成的产品图像

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

R155 VTA 认证对汽车入侵检测系统(IDS)合规要求

续接上集“浅谈汽车网络安全车辆型式认证&#xff08;VTA&#xff09;的现状和未来发展”&#xff0c;有许多读者小伙伴有联系笔者来确认相关的R155 VTA网络安全审核要求&#xff0c;基于此&#xff0c;笔者将针对 R155 VTA 每一条网络安全审核细则来具体展开。 今天就先从汽车…

利用Java爬虫按关键字搜索淘宝商品

在当今数字化时代&#xff0c;获取和分析电子商务平台上的商品数据对于市场研究者、数据分析师或个人买家而言是一项非常有用的能力。本文将详细介绍如何利用Java爬虫技术按关键字搜索淘宝商品&#xff0c;并提供相应的代码示例。 1. 爬虫技术简介 爬虫&#xff08;Web Crawle…

数据结构——B-树

目录 一.常见的搜索结构 二.B-树概念 三.B-树的插入分析及实现 1.插入分析 2.插入实现 1. B-树的节点设计 2.插入key的过程 3.B-树的插入实现 4.B-树的验证 5.B-树的性能分析 四.B树和B*树 1.B树 2.B*树 3.总结 五.B-树的应用 1.索引 2.MySQL索引简介 1.MyIS…

【vue2】封装自定义的日历组件(二)之基础添加返回到今天的功能

在上次封装的日历组件的基础上&#xff0c;我们完善下&#xff0c;在月份变化后&#xff0c;返回到当前月份的的当天日期的显示。 效果展示 代码逻辑 高亮的UI样式美化 .calendar-day {color: #d7d7d7;width: 100px;line-height: 80px;text-align: center;box-sizing: borde…

连续大涨,汉王科技跑步进入AI应用舒适区

OpenAI正在进行的“12天12场直播”让行业再次沸腾&#xff0c;二级市场也在寻找AI应用的机会。这刺激了12月首周同花顺sora概念涨超11&#xff05;&#xff0c;远超同期大盘指数涨幅。 截至目前&#xff0c;“满血版”推理模型o1和月收费高达200美元的ChatGPT Pro订阅服务&…

沃丰科技智能客服在跨境电商独立站中的核心角色

随着全球化进程的加速和互联网技术的不断发展&#xff0c;跨境电商行业蓬勃兴起&#xff0c;为消费者提供了更广阔、更便捷的购物选择。在这样一个竞争激烈的市场环境中&#xff0c;优质的客户服务成为了企业脱颖而出的关键。沃丰科技智能客服凭借其先进的技术和人性化的设计理…

智创 AI 新视界 -- AIGC 重塑广告行业的创新力量(16 - 7)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

入门级捡垃圾工作站记录

入门级捡垃圾工作站记录 想法 一直想着拥有有一台自己的多功能机子&#xff0c;一个笔记本很难事事包办&#xff0c;本来打算配一个台式机&#xff0c;后来研究了一下&#xff0c;索性捡垃圾拼装的工作站&#xff0c;性价比更高&#xff0c;稳定性也更强&#xff0c;而且还可…

SpringBoot【三】多环境切换,实例演示

一、前言 实际的项目开发中&#xff0c;一个项目通常会存在多个环境&#xff0c;例如&#xff0c;开发环境、测试环境和生产环境等。不同环境的配置也不尽相同&#xff0c;例如开发环境使用的是开发数据库&#xff0c;测试环境使用的是测试数据库&#xff0c;而生产环境使用的是…

Node.js创建Express项目安装express-generator报错

一、在我进行Node.js项目开发时&#xff0c;使用Express框架构建一个Express项目&#xff0c;时报错&#xff1a; npm warn deprecated mkdirp0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has change…

在 .NET 9 中让您的 OpenAPI(Swagger)文档 UI 变得出色

从 .NET 9 开始&#xff0c;默认模板中不再包含 Swagger UI webapi。虽然文档仍然包含在内&#xff0c;但现在通过调用MapOpenApi&#xff0c;UI 不再存在。很高兴&#xff0c;重新获得文档 UI 相对容易。但 UI 本来就很无聊&#xff0c;所以让我们来点更花哨的东西吧&#xff…

使用Kimi开发自己的问答应用

概述 Kimi是大家常用的一个人工智能助手&#xff0c;本文使用Kimi开发文档&#xff0c;以node作为后端&#xff0c;开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手&#xff0c;擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…

2024.12.09标准IO(作业)

1、使用这fscanf和fprintf两个函数实现文件的拷贝。 #include <myhead.h>int main(int argc, const char *argv[]) {//使用这fscanf和fprintf两个函数实现文件的拷贝FILE *fp1 fopen("./1.txt","r"); //打开被拷贝的文件1.txtif(NULL fp1){perror…

JK软考小程序上线啦

经过一段时间的题库整理和录入&#xff0c;JK软考小程序终于和大家见面了&#xff01; 扫描识别赶紧体验吧&#xff1a; JK软考是一款专门为准备软考的考生设计的移动学习工具。JK软考集成了丰富的软考题目资源&#xff0c;通过便捷的操作界面和多样化的功能&#xff0c;帮助考…