盘点spring-boot-3-jwt-security中如何使用jwt+security

news2024/10/7 15:18:29

目录

SecurityApplication类中

AuthenticationService

register方法

authenticate方法

saveUserToken略

revokeAllUserTokens方法

refreshToken方法

ApplicationConfig

Bean:UserDetailsService

Bean:AuthenticationProvider

Bean:AuthenticationManager

Bean:PasswordEncoder

JwtAuthenticationFilter

JwtService

LogoutService

SecurityConfiguration

其他


本文讲的是spring-boot-3-jwt-security目前800star

阅前操作:项目自己down下来自己看一看

环境:

jdk17

Maven 3+

pgsql

Spring Boot 3.0

Spring Security

JWT(JSON Web Tokens)

Lombok

相应的颜色是埋的坑和对应的解答

SecurityApplication类中

和我们写的启动类无异,多了一个CommandLineRunner的bean。

这个bean中的AuthenticationService,我们先略过下边再观察,很明显构建了两个user,并把user “register” 到了AuthenticationService

至于这个CommandLineRunner的bean

它是一个用于在应用程序启动时执行特定代码的接口。当应用程序启动完成后,Spring Boot会自动运行实现了CommandLineRunner接口的Bean。

CommandLineRunner接口的主要作用是在应用程序启动时执行一些初始化或预处理的任务。你可以将需要在应用程序启动时运行的代码放在实现CommandLineRunner接口的类中,并通过注解或配置将其注册为Spring Bean。

 接下来,我们看AuthenticationServiceregister是如何实现的

AuthenticationService

我们放眼望去,它就是一个有关于认证标准的服务类。我们逐一分析方法。

register方法

参数:它接收的是一个具有user属性的一个类RegisterRequest。

步骤:

1.根据参数构建了一个user,其中密码使用passwordEncoder加密

2.将构建的user入库

3.对这个构建的user生成token

4.对这个构建的user生成RefreshToken

5.将token入库。注:token和userId关联

6.返回

authenticate方法

参数:邮箱和密码(类似于使用邮箱密码登录,也可以类比为用户名密码登录)

步骤:

1.根据入参校验邮箱密码

2.为此用户生成token

3.为此用户生成RefreshToken

4.让该用户下的token都过期

5.刚刚生成的token入库

6.返回

saveUserToken略

revokeAllUserTokens方法

参数:user

步骤:

1.找到此用户所有的token

2.把所有token的过期字段设置为true

3.更新token

refreshToken方法

参数:HttpServletRequest和HttpServletResponse

步骤:

1.获取到请求的RefreshToken

2.通过RefreshToken获取用户邮箱

3.从库中找到该用户

4.校验该用户和该RefreshToken是否有效

5.为该用户生成token取消该用户库中所有token,存入token库

6,返回

说到这里,流程大概明了了,接下来让我们关注更多细节

ApplicationConfig

Bean:UserDetailsService

实现了UserDetailsService接口的loadUserByUsername方法

从数据库去查传过来的邮箱对应的user

Bean:AuthenticationProvider

配置Provider,在认证时,源码中调用UserDetailsService的实现去校验

Bean:AuthenticationManager

默认是ProviderManager

Bean:PasswordEncoder

使用BCryptPasswordEncoder

JwtAuthenticationFilter

继承OncePerRequestFilter,是 Spring Security 提供的一个过滤器基类,确保每个请求仅被过滤一次。

doFilterInternal的实现步骤

1.如果是认证接口 则放行

2.如果没有Authorization头或不含token则放行

3.根据token找到用户邮箱

4.从数据库找到user

5.检验token是否可用

6.验证token和user的有效性

7.将认证对象设置到当前线程的安全上下文中

8.放行

JwtService

从配置文件中读取密钥,token有效期和refreshToken有效期

这没什么好说的,主要是使用工具构建token,根据token拿到用户名等一些功能的封装

LogoutService

实现了LogoutHandler主要是对登出操作进行的处理,比如数据库token设置过期,安全线程上下文清空。

SecurityConfiguration

注解EnableWebSecurity作用如下图

 注解EnableMethodSecurity作用如下图

 对于SecurityFilterChain的bean是配置了http请求的限制,这是一个总的配置类,你会发现,我们上边解析的一些bean都会在这里出现,比如JwtAuthenticationFilter,LogoutHandler。

在这个bean中可以对自己的接口进行定制化配置,方法语意作用比较明确,所以就不一一讲解方法。

其他

上边讲解主要从service层和细节地方讲了,下边可以从AdminController找到如何使用注解去控制权限。

总的来说项目比较简单,不过对你了解jwt和security也是足够了,也算是拿来即用的脚手架了。

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

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

相关文章

浅谈智能集成电力电容器的应用意义

安科瑞 华楠 摘要:该文通过智能集成电力电容器研发背景的说明,介绍该产品基于数字信号处理器(DSP)和单片机相结合的双CPU技术智能无功补偿技术,集成复合开关的过零投切与计算机智能网络模块技术,实现了现代…

语音信号的采集--电脑录音

准备条件: 1.电脑麦克风打开。(联想小新AIR2021 打开方式:点击电脑右下角“电源”,点击“麦克风打开”) 2.打开电脑自带的录音机。(电脑界面搜索框中键入“录音机”) 3.打开音乐播放软件&…

【JavaEE】Linux基本使用

Linux基本使用 文章目录 【JavaEE】Linux基本使用1. 如何获取一个Linux的环境2. 终端软件来远程登录3. Linux基本使用3.1 命令提示符3.2 ls3.3 cd3.4 pwd3.5 touch3.6 cat3.7 man3.8 echo3.9 vim3.9.1 打开文件3.9.2 编辑文件3.9.3 保存退出3.9.4 vimtutor 3.10 mkdir3.11 rm3.…

【设计模式】23种设计模式——单例模式(原理讲解+应用场景介绍+案例介绍+Java代码实现)

单例模式(Singleton) 介绍 所谓类的单例设计模式,就是采取一定的方法,保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。比如Hibernate的Sessio…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(三)SG_CopyPointsWithHierarchy

继续解析《Electric Dreams》项目中的自定义节点和子图:SG_CopyPointsWithHierarchy和PostCopyPoints-OffsetIndices 文章目录 前导文章标准组合拳SG_CopyPointsWithHierarchyPostCopyPoints-OffsetIndices使用情景Execute with ContextIteration Loop Body 小结 前…

看懂Congestion Map

往期文章链接: ​​​​​​ICC2:工具是如何平衡std cell利用率和congestion的? ICC2:使用report_placement检查floorplan ICC2:使用global route分析绕线 ICC2:congestion的解决办法

postman 自动化测试

postman 自动化测试 0、写在前面1、变量引用1.1、如何在请求体中引变量 0、写在前面 在有些时候看官方文档 比网上搜索效率要高, 比如网上搜一通还是不知道用法或者没有搜索到你想要的用法的时候。 postman官方文档 : https://learning.postman.com/docs/introduct…

从 robot 坐标系到 orb2 坐标系的变换

机器人坐标系 在机器人学和机器人导航中,通常使用右手坐标系,其定义如下: X轴:通常定义为机器人的"前"或"向前"方向。在移动机器人中,这通常是机器人行进的方向。 Y轴:在右手坐标系中,Y轴通常定义为机器人的"左"或"向左"方向。…

有趣的命令——————用shell脚本实现与电脑猜价格游戏,小朋友比较合适哟~~~

vim games.sh 输入以下内容#!/bin/bashecho "这是一个小游戏,猜价格(1--1000)" pc$(expr $RANDOM % 1000 1) cs0 while true doread -p "请输入你猜的价格:" intlet csif [ $int -gt $pc ]thenecho "价…

docker+jenkins 实现自动化部署

前期准备工作 工欲善其事必先利其器,所以前期的准备工作必须做好,那么我们要实现自动化部署,必须提前准备什么呢?哈哈哈,可能有一些小伙伴已经猜到了,我们需要一台自己的服务器,这里博主使用的…

你不会还不知道什么是企业博客吧?

企业博客是指由企业或组织创建的在线平台,主要是用于发布与其业务、产品、行业和相关主题相关的文章、信息和观点。通过企业博客可以实现促进品牌推广、客户培养和业务发展等,对于企业发展有极其重要的作用。 企业博客的目的 1.提供有关企业产品和服务的…

Pytorch基本使用—参数初始化

深度学习模型参数初始化是指在训练深度神经网络时,对网络的权重和偏置进行初始化的过程。合适的参数初始化可以加速模型的收敛,并提高模型的性能。 ✨ 1 基本介绍 在深度学习中,常用的参数初始化方法有以下几种: 零初始化&#…

SwinIR Transformer训练教程(使用自己的数据集)

使用自己的数据集训练SwinIR Transformer SwinIR Transformer图像超分辨率重建训练教程 目录 使用自己的数据集训练SwinIR Transformer一、使用MATLAB对数据集进行BICUBIC插值下采样二、使用MATLAB对数据集进行BICUBIC插值下采样三、训练3.1 下载训练源代码3.2 修改json文件3.…

Servlet文档1

Servlet 1、如何去书写一个servlet2、如何去访问一个servlet3、如何去快速创建一个servlet4、web中一些路径的访问分析5、servlet一些配置项(servletConfig)6、web项目的配置项(servletContext)servlet简介 Servlet 是sun公司提供…

记录一次unraid中毒经历(xmrig)

起因 :一大早发现unraid小主机风扇狂转,CPU一半线程拉满 类似这样,只不过是左边一列所有核 执行top命令,发现xmrig占用 cpu 790 kill [ID] find / -name xmrig rm /bin/xmrig成功,CPU功耗马上下降,但是几…

k8s 就绪探针

【k8s 系列】k8s 学习二十,就绪探针 提起探针,不知兄dei 们是否有印象,之前我们分享过存活探针,分享存活探针是如何确保异常容器自动重启来保持应用程序的正常运行,感兴趣的可以查看文章 k8s 系列k8s 学习十七&#x…

揭示实时定位控件在配送小程序中的作用与价值

随着互联网技术的发展,配送小程序在生活中扮演着越来越重要的角色。而实时定位控件作为配送小程序中不可或缺的一部分,具有极大的作用与必要性。本文将以【乔拓云】第三方工具为例子,从商家的方面,对实时定位控件在配送小程序中的…

我说MySQL每张表最好不超过2000万条数据,面试官让我回去等通知?

事情是这样的 下面是我朋友的面试记录: 面试官:讲一下你实习做了什么。 朋友:我在实习期间做了一个存储用户操作记录的功能,主要是从MQ获取上游服务发送过来的用户操作信息,然后把这些信息存到MySQL里面,…

怎么在unity3D工程中导入Newtonsoft.Json

怎么在unity3D工程中导入Newtonsoft.Json unity旧版本自带的json接口太难用了(JsonUtility),不能序列化字典和列表等对象,只能序列化基础类型对象,所以基本等于没有。 Newtonsoft.Json-for-Unity-master 的github下载…

【Linux后端服务器开发】Shell外壳——命令行解释器

目录 一、Shell外壳概述 二、描述Shell外壳原理的生动例子 三、C语言模拟实现Shell外壳 一、Shell外壳概述 在狭义上 , 我们称Linux操作系统的内核为 Linux 在广义上 , Linux发行版 Linux内核 外壳程序 就比如市面上现在的redhat, centos, ubuntu等等我们耳熟能详的Linux发…