自己弄的一个可自定义配置JWT的spring-boot-starter,方便在spring security中集成JWT认证。
使用
首先在你的spring boot项目的pom.xml添加我的github个人仓库
<repositories>
<repository>
<id>chenhuanming-repo</id>
<name>chenhuanming-repo</name>
<url>https://raw.githubusercontent.com/zerouwar/my-maven-repo/master</url>
</repository>
</repositories>
然后添加jwt-spring-boot-starter
依赖
<dependency>
<groupId>cn.chenhuanming</groupId>
<artifactId>jwt-spring-boot-starter</artifactId>
<version>0.0.2</version>
</dependency>
这样已经集成了JWT认证。可以运行你的spring boot项目,用用户名和密码发出POST /login请求(spring security默认用户user,密码在启动日志可以获取),可以拿到一个带token的json
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwic2hvcnRFeHAiOjE1MDMwNjg4NDksImV4cCI6MTUwMzY3MzU4OSwiaWF0IjoxNTAzMDY4Nzg5LCJhdXRob3JpdGllcyI6IlJPTEVfVVNFUiJ9.s6iAIh52gyfrPWfLEPjasYZ7GNFt6Vwb0itLZ5De89I"
}
这样就可以用这个token去访问受保护的api了(默认所有api都要求认证,后面会说怎么自定义配置),在这个例子里就像下面这样设置http header的Authorization
Authorization=Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwic2hvcnRFeHAiOjE1MDMwNjg4NDksImV4cCI6MTUwMzY3MzU4OSwiaWF0IjoxNTAzMDY4Nzg5LCJhdXRob3JpdGllcyI6IlJPTEVfVVNFUiJ9.s6iAIh52gyfrPWfLEPjasYZ7GNFt6Vwb0itLZ5De89I
默认token有一个短期有效期(15分钟)和长期有效期(7天),如果token在长期有效期内,短期失效可以要求刷新token,服务端如果检查到token失效,会返回412状态码,并在response body返回一个带refreshToken
的json。
自定义配置
很少情况需要用spring security那个随机密码,所以很多时候我们需要自定义UserDetailsService
。只需要把自己实现的UserDetailsService
注册为spring Bean
,jwt-spring-boot-starter
会自动发现你写的UserDetailsService
。
其他支持自动发现的组件有:
-
TokenUtils
封装token操作的工具类 -
JWTSuccessHandler
验证用户和密码成功后调用的handler,继承了AuthenticationSuccessHandler
-
TokenAuthorizationFilter
拦截请求,进行JWT验证的Filter。 -
JWTAuthorizationManager
负责JWT验证工作的管理器。 -
TokenExpiredHandler
token失效后的handler -
TokenRefreshHandler
token需要刷新的handler -
TokenSuccessHandler
token验证成功的handler -
TokenInvalidHandler
token不合法的handler
另外可以通过application.yml设置一些配置信息,如要改变默认的token短期有效期,可以设置utils.jwt.shortExp
的值(分钟),更多配置信息可以看JWTProperties
类。
最后,一般程序都会继承WebSecurityConfigurerAdapter
来定义spring security的安全配置,引用了jwt-spring-boot-starter
后,不能继承WebSecurityConfigurerAdapter
,需要继承JWTSecurityAutoConfiguration
(这个类继承了WebSecurityConfigurerAdapter
),JWTSecurityAutoConfiguration
只是包装了WebSecurityConfigurerAdapter
,基本使用方法都跟原来一样,除了void configure(HttpSecurity http)
方法不能直接重写(通过实现JWTSecurityAutoConfiguration
的void configureHttpSecurity(HttpSecurity http)
钩子方法)。可以查看JWTSecurityAutoConfiguration
的源码,大概就是这样:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().addFilterBefore(tokenAuthorizationFilter, SecurityContextPersistenceFilter.class);
}
项目地址
项目托管在github上