令牌配置
【1】令牌本身的配置
- 令牌相关的配置都放在了AccessTokenConfig这个配置类中,代码如下:
@Configuration
public class AccessTokenConfig {
/**
* 令牌的存储策略
*/
@Bean
public TokenStore tokenStore() {
//使用JwtTokenStore生成JWT令牌
return new JwtTokenStore(jwtAccessTokenConverter());
}
/**
* JwtAccessTokenConverter
* TokenEnhancer的子类,在JWT编码的令牌值和OAuth身份验证信息之间进行转换。
* TODO:后期可以使用非对称加密
*/
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter(){
JwtAccessTokenConverter converter = new JwtAccessTokenEnhancer();
// 设置秘钥
converter.setSigningKey(TokenConstant.SIGN_KEY);
/*
* 设置自定义得的令牌转换器,从map中转换身份信息
* fix(*):修复刷新令牌无法获取用户详细信息的问题
*/
converter.setAccessTokenConverter(new JwtEnhanceAccessTokenConverter());
return converter;
}
/**
* JWT令牌增强,继承JwtAccessTokenConverter
* 将业务所需的额外信息放入令牌中,这样下游微服务就能解析令牌获取
*/
public static class JwtAccessTokenEnhancer extends JwtAccessTokenConverter {
/**
* 重写enhance方法,在其中扩展
*/
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
Object principal = authentication.getUserAuthentication().getPrincipal();
if (principal instanceof SecurityUser){
//获取userDetailService中查询到用户信息
SecurityUser user=(SecurityUser)principal;
//将额外的信息放入到LinkedHashMap中
LinkedHashMap<String,Object> extendInformation=new LinkedHashMap<>();
//设置用户的userId
extendInformation.put(TokenConstant.USER_ID,user.getUserId());
//添加到additionalInformation
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(extendInformation);
}
return super.enhance(accessToken, authentication);
}
}
}
- 1、JwtAccessTokenConverter
令牌增强类,用于JWT令牌和OAuth身份进行转换
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter(){
JwtAccessTokenConverter converter = new JwtAccessTokenEnhancer();
// 设置秘钥
converter.setSigningKey(TokenConstant.SIGN_KEY);
/*
* 设置自定义得的令牌转换器,从map中转换身份信息
* fix(*):修复刷新令牌无法获取用户详细信息的问题
*/
converter.setAccessTokenConverter(new JwtEnhanceAccessTokenConverter());
return converter;
}
令牌的存储策略,这里使用的是JwtTokenStore,使用JWT的令牌生成方式,其实还有以下两个比较常用的方式
-
- RedisTokenStore:将令牌存储到Redis中,此种方式相对于内存方式来说性能更好
- JdbcTokenStore:将令牌存储到数据库中,需要新建从对应的表,有兴趣的可以尝试
-
3、SIGN_KEY
JWT签名的秘钥,这里使用的是对称加密,资源服务中也要使用相同的秘钥进行校验和解析JWT令牌。
【2】令牌管理服务的配置
这个放在了AuthorizationServerConfig这个配置类中,代码如下:
- 使用的是DefaultTokenServices这个实现类,其中可以配置令牌相关的内容,比如access_token、refresh_token的过期时间,默认时间分别为12小时、30天。
- 最重要的一行代码当然是设置令牌增强,使用JWT方式生产令牌,如下:services.setTokenEnhancer(jwtAccessTokenConverter);
@Bean
public AuthorizationServerTokenServices tokenServices() {
System.out.println("令牌管理服务的配置");
DefaultTokenServices services = new DefaultTokenServices();
services.setClientDetailsService(clientDetailsService);
services.setSupportRefreshToken(true);
services.setTokenStore(tokenStore);
services.setAccessTokenValiditySeconds(60 * 60 * 24 * 3);
services.setRefreshTokenValiditySeconds(60 * 60 * 24 * 3);
services.setTokenEnhancer(jwtAccessTokenConverter);
return services;
}
【3】、令牌访问端点添加tokenServices
|