springsecurity登录以后,默认会返回一个令牌(access_token):
通过查看源码,DefaultTokenServices
中的createAccessToken
方法,令牌其实就是一个uuid:
实际使用中,一般不会使用默认令牌,而是使用jwt令牌来替代默认令牌,这样做的好处是携带默认令牌访问资源,每次都要通过授权服务来认证令牌是否有效,而jwt则可以做到资源服务中自己解析从而判断令牌的有效性;另外一个优势就是jwt令牌有更高的安全性,可以使用公钥和私钥进行加密和解密,不容易被破解。
jwt令牌配置,定义JwtAccessTokenConverter
,配置TokenStore
`@Bean
public TokenStore tokenStore() {
// 使用内存存储令牌
// return new InMemoryTokenStore();
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
//对称秘钥,资源服务器使用该秘钥来验证
converter.setSigningKey(JwtConstant.SING_KEY);
// DefaultAccessTokenConverter accessTokenConverter = (DefaultAccessTokenConverter) converter.getAccessTokenConverter();
// accessTokenConverter.setUserTokenConverter(customUserAuthenticationConverter);
return converter;
}`
在AuthorizationServerTokenServices
配置中添加令牌增强,令牌增强的意思是,用jwt令牌来加强默认令牌,而不是替代。
// 令牌(token)管理服务
@Bean
public AuthorizationServerTokenServices tokenService(){
DefaultTokenServices services = new DefaultTokenServices();
// 客户端详情服务
// 因为是向客户端颁发令牌,所以需要知道是哪一个客户端
services.setClientDetailsService(myClientDetailsService);
// 支持刷新令牌
services.setSupportRefreshToken(true);
// 令牌存储策略
services.setTokenStore(tokenStore);
//令牌增强
TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));
services.setTokenEnhancer(tokenEnhancerChain);
// 令牌默认有效期24小时
services.setAccessTokenValiditySeconds(7200 * 12);
// 刷新令牌默认有效期3天
services.setRefreshTokenValiditySeconds(259200);
return services;
}
运行结果:
这里可以看到,多了一个jti,这个jti就是默认的令牌,也就是uuid。
查看源码:JwtAccessTokenConverter
中的enhance
方法,对现有的token进行了增强:
其中,encode的方法将当前信息转化成jwt token令牌,而默认的token会被key为jti保存。
来源:CSDN
作者:mac文的java路
链接:https://blog.csdn.net/weixin_42196915/article/details/104171693