# JWT Demo **Repository Path**: efsoft/jwt-demo ## Basic Information - **Project Name**: JWT Demo - **Description**: Spring Boot 3.4 + Spring Security 6 + JWT实现的一个生成token及认证管控的Demo - **Primary Language**: Unknown - **License**: Unlicense - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-04-02 - **Last Updated**: 2025-04-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **Jwt** **Demo** - Author: menlisharp@126.com - 2025-04-02 - 说明:学习Spring Boot + Spring Security 6 + JWT的一个Demo,没有使用大多数人使用的BycptPasswordEncoder,主要原因是我基于原有的用户信息库做的DEMO,用户密码使用的MD5加密算法,但是Spring Security 6已经不支持MD5算法,于是自己实现了一个Md5PasswordEncoder类。 ## 1. 环境 - Spring Boot 3.4.x - Spring Security 6 - JWT - JPA - MS Sql Server 2016及以上版本 - IDE - Eclipse 版本:2025-03 (4.35.0) ## 2. 加密算法 因为我基于原有的用户信息库做的DEMO,用户密码使用的MD5加密算法,但是Spring Security 6已经不支持MD5算法,于是自己实现了一个Md5PasswordEncoder类。 ## 3. 设计说明 ### 3.1. 数据库准备 - 创建数据库用户 admin / admin - 创建数据库TestDB - 创建用户表UserInfo ### 3.2. 编译运行及测试 #### 3.2.1. 后台运行 - IDE 导入项目 - 等待maven下载依赖包 - 运行 #### 3.2.2. Postman测试 - 获取Token: ~~~ url: 127.0.0.1:8080/api/v1/auth/getToken ~~~ 请求方式:Post Body: ~~~ {"loginName":"admin", "password": "admin"} ~~~ 正常响应的例子: ~~~ { "data": { "user": { "id": 3120, "password": "", "enabled": true, "accountNonLocked": true, "username": "伍小军", "credentialsNonExpired": true, "accountNonExpired": true, "authorities": null }, "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJOTTJGRDA4IiwiaWF0IjoxNzQzNTc1MTA1LCJleHAiOjE3NDM1Nzg3MDV9.WAhycVXdS2ZUxreiu3HaKT76kKzQan07Y-1f-ZIysZE" }, "code": "0", "msg": "操作成功!" } ~~~ 获取token后,新建一个请求页,配置如下: ~~~ url: http://127.0.0.1:8080/hello ~~~ - 请求方式:Get - 请求头中添加一项:Authorization,值为"Bearer "打头,后边跟上上例获取的token,即 ~~~ Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJOTTJGRDA4IiwiaWF0IjoxNzQzNTc1MTA1LCJleHAiOjE3NDM1Nzg3MDV9.WAhycVXdS2ZUxreiu3HaKT76kKzQan07Y-1f-ZIysZE ~~~ 学习心得: 其实JWT就是一个生成Token传递给客户端,然后服务端接受到后续的请求后,再调用JWT解析Token获取用户识别号(例如用户ID,用户登录名,用户名等唯一识别用户的识别符号;最好是用户ID(这样可以使用repository的findById直接从数据库中获取到用户信息;当然如果是大用户量;则应该用Redis来缓存用户信息)。 调试经历: 1. UserInfo这个Entity类不能作为响应信息发送给客户端,因为包含了很多敏感信息;因此另外实现一个用户dto类RequestUser,用于与客户端登录请求;生成Token后返回给客户端的RequestUser.password应该清空;或者另外用HashMap封装用户信息,然后返回给客户,避免暴露密码信息。 2. LoginUser类实现UserDetails这个Spring Security接口,用于处理JWT Token的解析得到的用户信息(用户登录名/ID,Token有效期,用户角色等) 3. Spring Security 6已经做了很多变动,网上的Spring Security6教程已经无法适应。比如WebSecurityConfigurerAdapter这个类已经弃用,在设计SecurityConfig时只须加上@EnableWebSecurity注解即可。