赞
踩
目录
本文讲的是spring-boot-3-jwt-security目前800star
阅前操作:项目自己down下来自己看一看
环境:
jdk17
Maven 3+
pgsql
Spring Boot 3.0
Spring Security
JWT(JSON Web Tokens)
Lombok
相应的颜色是埋的坑和对应的解答
和我们写的启动类无异,多了一个CommandLineRunner的bean。
这个bean中的AuthenticationService,我们先略过下边再观察,很明显构建了两个user,并把user “register” 到了AuthenticationService。
至于这个CommandLineRunner的bean
它是一个用于在应用程序启动时执行特定代码的接口。当应用程序启动完成后,Spring Boot会自动运行实现了
CommandLineRunner
接口的Bean。
CommandLineRunner
接口的主要作用是在应用程序启动时执行一些初始化或预处理的任务。你可以将需要在应用程序启动时运行的代码放在实现CommandLineRunner
接口的类中,并通过注解或配置将其注册为Spring Bean。
接下来,我们看AuthenticationService的register是如何实现的
我们放眼望去,它就是一个有关于认证标准的服务类。我们逐一分析方法。
参数:它接收的是一个具有user属性的一个类RegisterRequest。
步骤:
1.根据参数构建了一个user,其中密码使用passwordEncoder加密
2.将构建的user入库
3.对这个构建的user生成token
4.对这个构建的user生成RefreshToken
5.将token入库。注:token和userId关联
6.返回
参数:邮箱和密码(类似于使用邮箱密码登录,也可以类比为用户名密码登录)
步骤:
1.根据入参校验邮箱密码
2.为此用户生成token
3.为此用户生成RefreshToken
4.让该用户下的token都过期
5.刚刚生成的token入库
6.返回
参数:user
步骤:
1.找到此用户所有的token
2.把所有token的过期字段设置为true
3.更新token
参数:HttpServletRequest和HttpServletResponse
步骤:
1.获取到请求的RefreshToken
2.通过RefreshToken获取用户邮箱
3.从库中找到该用户
4.校验该用户和该RefreshToken是否有效
5.为该用户生成token,取消该用户库中所有token,存入token库
6,返回
说到这里,流程大概明了了,接下来让我们关注更多细节
实现了UserDetailsService接口的loadUserByUsername方法
从数据库去查传过来的邮箱对应的user
配置Provider,在认证时,源码中调用UserDetailsService的实现去校验
默认是ProviderManager
使用BCryptPasswordEncoder
继承OncePerRequestFilter,是 Spring Security 提供的一个过滤器基类,确保每个请求仅被过滤一次。
doFilterInternal的实现步骤
1.如果是认证接口 则放行
2.如果没有Authorization头或不含token则放行
3.根据token找到用户邮箱
4.从数据库找到user
5.检验token是否可用
6.验证token和user的有效性
7.将认证对象设置到当前线程的安全上下文中
8.放行
从配置文件中读取密钥,token有效期和refreshToken有效期
这没什么好说的,主要是使用工具构建token,根据token拿到用户名等一些功能的封装
实现了LogoutHandler主要是对登出操作进行的处理,比如数据库token设置过期,安全线程上下文清空。
注解EnableWebSecurity作用如下图
注解EnableMethodSecurity作用如下图
对于SecurityFilterChain的bean是配置了http请求的限制,这是一个总的配置类,你会发现,我们上边解析的一些bean都会在这里出现,比如JwtAuthenticationFilter,LogoutHandler。
在这个bean中可以对自己的接口进行定制化配置,方法语意作用比较明确,所以就不一一讲解方法。
上边讲解主要从service层和细节地方讲了,下边可以从AdminController找到如何使用注解去控制权限。
总的来说项目比较简单,不过对你了解jwt和security也是足够了,也算是拿来即用的脚手架了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。