文章目录
- Spring Boot 3 集成 Spring Security + JWT
- 准备工作
- 引入依赖
- 设计表结构
- 生成基本代码
- 白名单配置
- JWT配置
- 配置参数jwt密码、过期时间等
- 自定义未授权和未登录结果返回
- 创建JWT过滤器
- 改写SecurityConfig
- 登录验证
- 启动查看接口
- 未登录
- 登录
- 总结
Spring Boot 3 集成 Spring Security + JWT
准备工作
概述: 在本文中,我们将一步步学习如何使用 Spring Boot 3 和 Spring Security 来保护我们的应用程序。我们将从简单的入门开始,然后逐渐引入数据库,并最终使用 JWT 实现前后端分离。
引入依赖
这里主要用到了Mybatis-plus、hutool 、knife4j ,其他依赖可以直接勾选
我这里使用的Spring boot版本为
3.3.5
,使用3.4.0
整合JWT过滤器时,打开swagger会报错:jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: 'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)
,说是版本兼容问题。暂时没有找到很好的解决方案,所以给Spring boot版本降至3.3.5
。
设计表结构
关于表结构内容我这里不详细的说了,各个表字段内容,可以拉一下代码,获取表结构sql脚本。关注公众号:“Harry技术”,回复“jwt”,即可获取到整个项目源码以及表结构。
生成基本代码
白名单配置
因为我们这里引入knife4j ,关于knife4j 的相关配置可以参考《Spring Boot 3 整合Knife4j(OpenAPI3规范)》,我们需要将以下接口加入到白名单
JWT配置
JWT(JSON Web Token)相关资料网络上非常多,可以自行搜索,简单点说JWT就是一种网络身份认证和信息交换格式。
-
Header
头部信息,主要声明了JWT的签名算法等信息 -
Payload
载荷信息,主要承载了各种声明并传递明文数据 -
Signature
签名,拥有该部分的JWT被称为JWS,也就是签了名的JWT,用于校验数据
整体结构是:
配置参数jwt密码、过期时间等
- yml 配置
- 创建SecurityProperties
自定义未授权和未登录结果返回
在之前的案例中没有自定义未授权和未登录,直接在页面上显示错误信息,这样对于前端来说不是很好处理,我们将所有接口按照一定的格式返回,会方便前端交互处理。
- 未登录
- 未授权
创建JWT过滤器
这里直接使用了 Hutool-jwt提供的JWTUtil工具类,主要包括:JWT创建、JWT解析、JWT验证。
改写SecurityConfig
关于Spring Boot 3 集成 Spring Security相关的知识点,可以参考文章:《Spring Boot 3 集成 Spring Security(1)认证》、《Spring Boot 3 集成 Spring Security(2)授权》、《Spring Boot 3 集成 Spring Security(3)数据管理》。
这里主要做了以下几点配置:
- 将不需要认证鉴权的接口加入白名单
- 由于使用的是JWT,我们这里不需要csrf、禁用session
- 添加自定义未授权和未登录结果返回
- 配置 JWT 校验过滤器
我们根据数据库中的用户信息加载用户,并将角色转换为 Spring Security 能识别的格式。我们写一个SysUserDetails
类来实现自定义Spring Security 用户对象。
这里使用了@Cacheable
结合redis做的缓存处理,关于缓存相关配置,可以参考文章《Spring Boot 3 整合Redis(1) 基础功能》、《Spring Boot 3 整合Redis(2)注解驱动缓存》。
登录验证
- 写一个登录接口/auth/login,返回 token、tokenType等信息
- LoginResult 对象
启动查看接口
访问http://localhost:8080/swagger-ui/index.html
或者http://localhost:8080/doc.html
未登录
当我们处于未登录状态时访问/auth/info
接口,直接返回了我们自定义的异常信息
登录
这里我们登录用户 harry/123456
,设定用户角色TEST
,菜单权限不给字典相关的操作。
看到接口成功返回token等信息,我们将token信息填写到 Authorize,作为全局配置。
这时,我们访问/auth/info
,可以看到当前登录的用户信息
我们访问字典相关的接口,如:/sys_dict/page
,返回了没有相关权限的信息
访问其他接口,如:/sys_dept/page
,可以看到数据正常返回。
总结
到这里,我们已经掌握了Spring Boot 3 整合 Security 的全过程。我们将从简单的入门开始,然后学习如何整合数据库,并最终使用 JWT 实现前后端分离。这些知识将帮助我们构建更安全、更可靠的应用程序。后续我们会深入了解在项目中用到的一些其他框架、工具。让我们一起开始吧!
示例源码:关注公众号“Harry技术”,回复 jwt 获取源码地址。