# 前言
一个基于 Spring Security 的 JWT Token认证模块。这是我对之前项目一直在使用的JWT认证的模块进行封装,也是第一次编写Spring-Boot-Starter组件。
编写过程中参考了很多其他组件比如spring-boot-starter-security
、OAuth2WebSecurityConfiguration
等等,实现了一个基于JWT Token的即插即用认证授权模块。
该模块依赖如下,已经在模块POM添加,所以不必在项目POM中另外添加以下模块防止冲突。如果项目已经有一下模块可以使用exclude
去掉本模块的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
# 注意
该模块只是提供对Token的认证和授权,至于登录过程请自行决定策略,可以配合Spring Security的其他安全策略(formLogin()
...)进行验证,又或者自定义验证Controller
。
# 安装
添加到POM依赖
<dependency>
<groupId>com.github.759434091</groupId>
<artifactId>jwt-security-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
# 配置
# 两个Bean声明JwtUserFactory
、JwtTokenUtils
JwtTokenUtils
Jwt Token 生成和解析工具。有多个构造器选择,可以自定义签名,算法,Key.JwtUserFactory
根据Claims
生成JwtUser
# 修改Configuration
# 自动配置
若没有声明WebSecurityConfigurerAdapter
类型的Bean,
将会使用JwtConfigurerAdapter
作为默认配置。
# 手动配置
在你的WebSecurityConfigurerAdapter
中的configure(HttpSecurity http)
方法中添加如下代码
http
.apply(new JwtConfigurer<>(jwtTokenUtils(), jwtUserFactory()))
其中jwtTokenUtils
和jwtUserFactory
为先前声明的Bean。
# 使用
# 生成Token
请自定义验证策略,例如用户名密码验证,可以配合Spring Security的其他安全策略进行验证,又或者自定义验证Controller
。
验证成功之后,自行决定Token需要携带的Claims
,通过调用如下方法生成Token并返回给前端。其中expireField和expireAmount为Calendar类型的参数。
jwtTokenUtils.createJWT(Map<String, Object> claims, int expireField, int expireAmount)
# 验证Token
前端将Token缓存,当需要认证的时候请将Token以如下形式附加在请求头
Authorization:Bearer your_token
请求头为Authorization
,其值为"Bearer "
+ 你的Token,请注意Bearer后面空格的存在,前缀总共有7位。
# 获取JwtUser
JwtUser
通过jwtUserFactory
解析Token payload中的Claims
生成。
生成之后可以在Controller
通过如下形式获取,在参数加上如下参数即可获得
@TokenUser JwtUser xxx
# 选择Authority
JWT-Security 支持Spring Security的Authority权限控制,只需要在JwtUserFactory
Bean中实现生成的JwtUser
中的getGrantedAuthorities
方法。
# DEMO
配置DEMO请参考
# first spring security (opens new window)
其中有两份配置,一份是手动配置DEMO,一份是自动配置DEMO