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,一经查实,立即删除!

相关文章

数据库-select查询语句

表复制&#xff1a;key不会被复制: 主键、外键和索引 复制表 1.复制表结构&#xff0b;记录 &#xff08;key不会复制: 主键、外键和索引&#xff09; 语法:create table 新表 select * from 旧表; mysql>use company; mysql> create table new_t1 select * from employe…

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默认窗口布局 打开…

了解MySQL中的存储过程,请看过来

引言 在数据库编程中&#xff0c;存储过程是一种强大的工具&#xff0c;它允许开发者封装复杂的逻辑&#xff0c;提高性能&#xff0c;并且增强安全性。本文将从基础概念讲起&#xff0c;逐步深入到存储过程的高级应用。 第一部分&#xff1a;存储过程基础 1. 存储过程简介 …

小红书推流机制底层逻辑

小红书推流机制底层逻辑 很多做运营的朋友问小红薯怎么玩❓ 小红书的核心逻辑流量是不是玄学❓ 今天就来说说小红书的流量算法机制&#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 (主页面) …

认识 DECIMAL 类型

文章目录 1.作用2.实现原理参考文献 1.作用 为保证小数精度不丢失&#xff0c;数据库表使用 DECIMAL 类型&#xff0c;服务代码中使用&#xff0c;比如 Golang 第三方库 https://github.com/shopspring/decimal。接口协议可以使用 string 表示。 从 DB 存储&#xff0c;服务数…

力扣:541. 反转字符串 II

541. 反转字符串 II 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0…

数据恢复:手机数据恢复,盘点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…

哈工大机器人竞技队成立22年来4次获国际冠军

另获得中国冠/亚/季军13次、国家级科技奖励60余次、省级科技竞赛奖励50余次、多次获得“最佳技术奖”。早在2009年就力克群雄获得唯一一张亚太大学生机器人大赛的入场卷&#xff0c;代表中国在东京5场全胜获得冠军。 2013届队员王永锟填报高考志愿时&#xff0c;恰巧看到哈工大…

Mac m1安装AWVS

目录 原因 安装 下载镜像 进入终端 启动AWVS 登陆 原因 由于 m1 为 arm 芯片,兼容性问题无法独立安装x86的AWVS,所以使用docker安装较为方便使用。

字符串补位

字符串补位 StringUtilsStrUtilString.format() StringUtils 字符串长度小于设定长度&#xff0c;则会补零&#xff0c;直至达到设定长度字符串长度等于或大于设定长度&#xff0c;则不进行任何操作&#xff0c;保持原字符串不变 import org.apache.commons.lang3.StringUtil…