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

目录

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也是足够了,也算是拿来即用的脚手架了。

猜你喜欢

转载自blog.csdn.net/wai_58934/article/details/131640286