说明
有时候我们需要扩展JWT中存储的内容,这里我们在JWT中扩展一个 key为enhance,value为enhance info 的数据。 继承TokenEnhancer实现一个JWT内容增强器
建议不要把太多的数据都塞到jwt里面,你可以直接给一个标识id去塞里面,这样也不会太大,解析完了之后取出来这个标识id后可以通过查询来获取想要的信息
代码地址
https://gitee.com/zjj19941/ZJJ_Neaten5.10/tree/master/ZJJ_SpringCloud_Oauth2/demo05
代码配置步骤
/**
* JWT内容增强器
*/
@Component
public class JwtTokenEnhancer implements TokenEnhancer {
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken,
OAuth2Authentication authentication) {
Map<String, Object> info = new HashMap<>();
// 这里演示是写死了,实际情况下可以动态的查询塞进去
//建议不要把太多的数据都塞到jwt里面,你可以直接给一个标识id去塞里面,
//这样也不会太大,解析完了之后取出来这个标识id后可以通过查询来获取想要的信息
info.put("enhance", "enhance info");
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);
return accessToken;
}
}
在授权服务器配置中配置JWT的内容增强器
@Autowired
private JwtTokenEnhancer jwtTokenEnhancer;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
//配置JWT的内容增强器
TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
List<TokenEnhancer> delegates = new ArrayList<>();
delegates.add(jwtTokenEnhancer);
delegates.add(jwtAccessTokenConverter);
enhancerChain.setTokenEnhancers(delegates);
endpoints.authenticationManager(authenticationManagerBean) //使用密码模式需要配置
.tokenStore(tokenStore) //配置存储令牌策略
.accessTokenConverter(jwtAccessTokenConverter)
.tokenEnhancer(enhancerChain) //配置tokenEnhancer
.reuseRefreshTokens(false) //refresh_token是否重复使用
.userDetailsService(userService) //刷新令牌授权包含对用户信息的检查
.allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST); //支持GET,POST请求
}
测试
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJmb3giLCJzY29wZSI6WyJhbGwiXSwiZXhwIjoxNjQ0MjkwNDI2LCJhdXRob3JpdGllcyI6WyJhZG1pbiJdLCJqdGkiOiIzOGRkOTEwZC1lYTIzLTRlNmItYTJkMC00YjdlY2MzOWU3MzUiLCJjbGllbnRfaWQiOiJjbGllbnQiLCJlbmhhbmNlIjoiZW5oYW5jZSBpbmZvIn0.t-wRIcK24u-LEGDqIfEI3WL735uPRyBNJiCl_SFrK2c",
"token_type": "bearer",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJmb3giLCJzY29wZSI6WyJhbGwiXSwiYXRpIjoiMzhkZDkxMGQtZWEyMy00ZTZiLWEyZDAtNGI3ZWNjMzllNzM1IiwiZXhwIjoxNjQ1MTU0MzY2LCJhdXRob3JpdGllcyI6WyJhZG1pbiJdLCJqdGkiOiIzMmI0OWE5Mi05ZWU2LTQxMDctYmMzYS1hZDBhMzU5NzgyNGMiLCJjbGllbnRfaWQiOiJjbGllbnQiLCJlbmhhbmNlIjoiZW5oYW5jZSBpbmZvIn0.oMdkFseeIJSZM9ur4iY2BpCrJ_cA_M5q-_oEwSfW7z4",
"expires_in": 59,
"scope": "all",
"enhance": "enhance info",
"jti": "38dd910d-ea23-4e6b-a2d0-4b7ecc39e735"
}
拿着access_token去解析
https://www.box3.cn/tools/jwt.html
可以发现多了扩展属性