SpringSecurity登录和校验流程简述

认证: 验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
授权: 经过认证后判断当前用户是否有权限进行某个操作

一、入门案例实现

搭建springboot工程后,创建启动类和Controller,引入SpringSecurity依赖
尝试访问Controller接口就会自动跳转到SpringSecurity的默认登录界面
输入用户名是user,密码会在控制台输出

1.1、登陆校验流程

登陆接口逻辑

携带用户名密码访问服务器,成功就会生成jwt并且返回给前端,
以后的请求就会在请求头携带token,只有获取到token中的用户信息才能确定是否有访问权限

SpringSecurity完整流程
原理是一个过滤器链,内部提供了各种功能的过滤器

下面看看入门案例的过滤器链
在这里插入图片描述

UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请

ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和
AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的过滤器。

1.2、自定义登陆校验

在这里插入图片描述
第一步:验证用户名和密码正确性
实现UserDetailsService接口重写其中的loadUserByUsername方法,
从数据库查询用户名和密码,查询成功就返回一个UserDetails对象(因为重写的这个方法需要返回这个对象)
在这里插入图片描述
如果要测试,需要往用户表中写入用户数据,并且如果你想让用户的密码是明文存储,需要在密
码前加{noop}

第二步 有了上面的准备工作后,就设置SpringSecurity拦截除了登陆接口的一系列接口了
继承WebSecurityConfigurerAdapter类,然后重写其中的 configure方法

在这里插入图片描述

接下来实现登陆方法
需要经过authenticationManager.authenticate(authenticationToken);进行验证,注意这个方法返回的对象就是第一步实现的UserDetailsService返回的对象,这个方法的参数是authenticationToken,包含了用户名密码信息
当authenticate不为空就代表密码验证成功接下来就根据UserId生成token,并且将token返回给前端
以后前端每次的请求就会携带这个token
在这里插入图片描述
经过前面的三步,已经实现了拦截除登陆接口的所有方法,并且实现了登陆接口的逻辑
其中实现UserDetailsService接口重写其中的loadUserByUsername方法来定义如何检验密码
通过在SpringSecurity配置类的configure方法指定需要拦截的方法
实现登陆接口,就能保证当访问没有被拦截的登陆方法就能根据需要生成token,供给后续SpringSecurity拦截的方法判断是否有访问权限

第四步
自定义一个过滤器,过滤器会获取请求头中的token,对token进行解析获取其中的userId,然后根据这个userid去redis获取对应的LoginUser对象,然后封装Authentication对象存入SecurityContextHolder(可以后续登出的时候获取到用户信息)
然后在配置类中通过http.addFilterBefore(jwtAuthenticationTokenFilter将token校验过滤器添加到过滤器链中。到此就实现了登陆接口进行校验密码生成token,其他接口访问前需要校验token
该方法需要继承OncePerRequestFilter类重写其中的doFilterInternal方法

在这里插入图片描述

在这里插入图片描述

登出接口

获取SecurityContextHolder中的认证信息,删除redis中对应的数据即可。
在这里插入图片描述
到这一步一个基本的登陆功能就实现了,但是并没有权限系统

授权

授权基本流程

使用默认的FilterSecurityInterceptor来进行权限校验。在
FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。
所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。
然后设置我们的资源所需要的权限即可。

使用基于注解的权限控制方案,通过使用注解来指定对应的资源所需的权限

首先需要先开启相关配置。

@EnableGlobalMethodSecurity(prePostEnabled = true)

在对应的资源使用@PreAuthorize注解,表示访问该资源需要test权限
在这里插入图片描述
写死的情况
在先前的写UserDetailsServiceImpl查询用户后获取到对应的权限信息封装到1UserDetails返回时就可以直接把权限信息封装到UserDetails中返回
所以这次需要前定义了UserDetails的实现类LoginUser,在其中添加相关权限的信息
具体添加属性

@JSONField(serialize = false)
private List<GrantedAuthority> authorities;

注解确保序列化时不会转为JSON字符串,保证了隐私性
这样进一步我们就能在UserDetailsServiceImpl返回带有权限信息的LoginUser对象了
在UserDetailsServiceImpl返回信息时也会多下面这一步

List<String> list = new ArrayList<>(Arrays.asList("test"));
return new LoginUser(user,list);

从数据库查询权限信息

RBAC权限模型
基于角色的权限控制(具体应该是用户关联角色,角色关联权限)
所以可以在UserDetailsServiceImpl中去调用mapper的方法查询权限信息封装到LoginUser对象中即可,之后经过权限过滤器就可以校验权限了。

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

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

相关文章

CCF- CSP 2018.12 - 1.2题 Java语言解题

2018.12-1 小明上学 import java.util.Scanner;public class text01_RedLight {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int r scanner.nextInt();int y scanner.nextInt();int g scanner.nextInt();int n scanner.nextInt();in…

springboot 两个相同类型的Bean使用@Resouce加载

问题描述 有两个相同类型的Bean 使用Service等注解注入或者Bean注入启动以后报错&#xff1a; qualifying bean of type com.fasterxml.jackson.databind.ObjectMapper available: expected single matching bean but found 2提示有相同的类型两个。 解决 * 每个Bean Resour…

第15章-超声波避障功能 HC-SR04超声波测距模块详解STM32超声波测距

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 15.1-超声波测距 完成超声波测距功能、测量数据显示在OLED屏幕上 硬件介绍 使用&#…

Creo装配体中只显示一部分零部件

从模型树中选中要显示的零部件&#xff0c;也可以结合Ctrl框选的方式选择对象。然后在模型树右击等会弹出选项&#xff0c;点选----即可

AD23中一些好用的功能

1.关闭在线DRC功能&#xff0c;可以避免布线时候一卡一卡的问题&#xff1a; 取消在线DRC的勾选&#xff1a; 2.AD的在线封装库&#xff0c;非常好用&#xff1a; 如何优雅地服用AD 21的在线元件库 – 吴川斌的博客 (mr-wu.cn) 3.如何恢复Altium Designer23默认窗口布局 打开…

小红书推流机制底层逻辑

小红书推流机制底层逻辑 很多做运营的朋友问小红薯怎么玩❓ 小红书的核心逻辑流量是不是玄学❓ 今天就来说说小红书的流量算法机制&#x1f525; ①电脑审核 ②分配初始流量 ③增加流量 ④推荐结束

DINO中为什么教师模型用大图,学生模型用小图

在 DINO&#xff08;可以理解为由DIstillation和NO labels的缩写&#xff09;中&#xff0c;使用不同的图像裁剪策略对教师模型和学生模型进行训练有其特定的原因。具体来说&#xff0c;教师模型使用大图&#xff08;global views&#xff09;&#xff0c;学生模型则同时使用大…

鸿蒙OS开发:【一次开发,多端部署】(音乐专辑主页)

一多音乐专辑主页 介绍 本示例展示了音乐专辑主页。 头部返回栏: 因元素单一、位置固定在顶部&#xff0c;因此适合采用自适应拉伸&#xff0c;充分利用顶部区域。专辑封面: 使用栅格组件控制占比&#xff0c;在小尺寸屏幕下封面图与歌单描述在同一行。歌曲列表: 使用栅格组…

LVM和配额管理

文章目录 一、LVM1.1 LVM概述1.2 LVM的管理命令1.3 创建LVM的过程第一步&#xff1a;先创建物理卷第二步&#xff1a;创建逻辑卷组 / 扩容第三步&#xff1a;创建逻辑卷 / 扩容对ext4文件系统的管理 1.4 删除LVM 二、磁盘配额2.1 磁盘配额概述2.2 磁盘配额命令2.3 磁盘配额设置…

从ZooKeeper切换到ClickHouse-Keeper,藏着怎样的秘密

本文字数&#xff1a;7772&#xff1b;估计阅读时间&#xff1a;20 分钟 作者&#xff1a;博睿数据 李骅宸&#xff08;太道&#xff09;& 小叮当 本文在公众号【ClickHouseInc】首发 本系列前两篇内容&#xff1a; 从ES到ClickHouse&#xff0c;Bonree ONE平台更轻更快&a…

vue3学习(三)

前言 继续接上一篇笔记&#xff0c;继续学习的vue的组件化知识&#xff0c;可能需要分2个小节记录。前端大佬请忽略&#xff0c;也可以留下大家的鼓励&#xff0c;感恩&#xff01; 一、理解组件化 二、组件化知识 1、先上知识点&#xff1a; 2、示例代码 App.vue (主页面) …

数据恢复:手机数据恢复,盘点7个有效手机恢复方法

你知道吗&#xff0c;超过 70% 的智能手机用户都曾有过数据丢失的经历&#xff1f;如果你曾经丢失过手机中的重要文件&#xff0c;别担心&#xff0c;本文有解决办法。在本文中&#xff0c;我们将告诉你如何使用简单的步骤恢复手机中丢失的数据。无论你是不小心删除了文件还是手…

go使用letteravatar生成圆形透明头像图标

官网地址&#xff1a;GitHub - disintegration/letteravatar: Letter avatar generation for Go 我对其中函数改了一下&#xff0c;支持多个字符&#xff0c;效果如下&#xff1a; func TestCreateAvatar(t *testing.T) {GenerateAvatar("Bird Fish", 0, "Bird…

stm32 FLYMCU串口刷机:程序文件不是0x8000000和0x20000000区域的”解决办法。

你想使用串口刷机&#xff0c;用FLYMCU &#xff0c; 刷入的bin 文件是不带地址的&#xff0c;得刷入HEX文件 才可以&#xff0c;因为程序并不知道是从0x8000000开始的&#xff0c; 如果必须得刷入bin 那就得用stm32Cube programmer 这个软件 也可以使用ST-LINK&#xff08;S…

Word如何绘制三线表及设置磅值

插入表格&#xff0c; 开始 边框 边框和低温 设置磅值 先全部设置为无边框 上边 1.5 0.5 以上内容未完善&#xff0c;请等待作者更新

qmt量化交易策略小白学习笔记第7期【qmt策略之股票快照指标】

qmt策略之股票快照指标 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;需免费开通量化回测与咨询实盘权限&#xff0c;可以和博主联系&#xff01; 股票快照指标 提供标…

窄通道、非液压、超续航、更安全,地牛AGV小车诠释高效物流!

agv 在智能时代&#xff0c;替代简单、机械、重复以及重体力工作的智能机器设备成为未来发展的趋势。这种趋势不仅可以提高工作效率和质量&#xff0c;还可以解放人力资源&#xff0c;使其更好地应用于创造性和高级智能任务上。 这不&#xff0c;现在有越来越多的工厂开始使用…

移动云服务器选购指南(图文教程详解)

目录 一、前言 二、基本概念 2.1 定义 2.2 部署形式 2.3 用处 三、主流平台 四、主流产品推荐 4.1 云电脑 4.2 云主机ECS 4.3 弹性公网 IP 五、选购指南 5.1 明确场景 5.2 明确需求 5.3 明确身份 新用户 老用户 5.4 明确时间 5.5 明确教程 六、总结 一、前言…

react 保持组件纯粹

部分 JavaScript 函数是 纯粹 的&#xff0c;这类函数通常被称为纯函数。纯函数仅执行计算操作&#xff0c;不做其他操作。你可以通过将组件按纯函数严格编写&#xff0c;以避免一些随着代码库的增长而出现的、令人困扰的 bug 以及不可预测的行为。但为了获得这些好处&#xff…

WMS仓库管理系统是怎么操作的?WMS操作流程详解

WMS 是仓库管理系统(Warehouse Management System) 的缩写。通过标准化的来料管理、拣配管理、仓库管理&#xff0c;打造实时化、透明化、可视化的仓储管理体系。一款合格的wms系统具有以下优势 提供实时可视性和自动化仓储流程&#xff0c;帮助企业更好地应对复杂的供应链网络…