说明

有时候我们需要扩展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

代码配置步骤

  1. /**
  2. * JWT内容增强器
  3. */
  4. @Component
  5. public class JwtTokenEnhancer implements TokenEnhancer {
  6. @Override
  7. public OAuth2AccessToken enhance(OAuth2AccessToken accessToken,
  8. OAuth2Authentication authentication) {
  9. Map<String, Object> info = new HashMap<>();
  10. // 这里演示是写死了,实际情况下可以动态的查询塞进去
  11. //建议不要把太多的数据都塞到jwt里面,你可以直接给一个标识id去塞里面,
  12. //这样也不会太大,解析完了之后取出来这个标识id后可以通过查询来获取想要的信息
  13. info.put("enhance", "enhance info");
  14. ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);
  15. return accessToken;
  16. }
  17. }

在授权服务器配置中配置JWT的内容增强器

  1. @Autowired
  2. private JwtTokenEnhancer jwtTokenEnhancer;
  3. @Override
  4. public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
  5. //配置JWT的内容增强器
  6. TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
  7. List<TokenEnhancer> delegates = new ArrayList<>();
  8. delegates.add(jwtTokenEnhancer);
  9. delegates.add(jwtAccessTokenConverter);
  10. enhancerChain.setTokenEnhancers(delegates);
  11. endpoints.authenticationManager(authenticationManagerBean) //使用密码模式需要配置
  12. .tokenStore(tokenStore) //配置存储令牌策略
  13. .accessTokenConverter(jwtAccessTokenConverter)
  14. .tokenEnhancer(enhancerChain) //配置tokenEnhancer
  15. .reuseRefreshTokens(false) //refresh_token是否重复使用
  16. .userDetailsService(userService) //刷新令牌授权包含对用户信息的检查
  17. .allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST); //支持GET,POST请求
  18. }

测试

发起get请求
http://localhost:8080/oauth/token?username=fox&password=123456&grant_type=password&client_id=client&client_secret=123123&scope=all
结果:

  1. {
  2. "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJmb3giLCJzY29wZSI6WyJhbGwiXSwiZXhwIjoxNjQ0MjkwNDI2LCJhdXRob3JpdGllcyI6WyJhZG1pbiJdLCJqdGkiOiIzOGRkOTEwZC1lYTIzLTRlNmItYTJkMC00YjdlY2MzOWU3MzUiLCJjbGllbnRfaWQiOiJjbGllbnQiLCJlbmhhbmNlIjoiZW5oYW5jZSBpbmZvIn0.t-wRIcK24u-LEGDqIfEI3WL735uPRyBNJiCl_SFrK2c",
  3. "token_type": "bearer",
  4. "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJmb3giLCJzY29wZSI6WyJhbGwiXSwiYXRpIjoiMzhkZDkxMGQtZWEyMy00ZTZiLWEyZDAtNGI3ZWNjMzllNzM1IiwiZXhwIjoxNjQ1MTU0MzY2LCJhdXRob3JpdGllcyI6WyJhZG1pbiJdLCJqdGkiOiIzMmI0OWE5Mi05ZWU2LTQxMDctYmMzYS1hZDBhMzU5NzgyNGMiLCJjbGllbnRfaWQiOiJjbGllbnQiLCJlbmhhbmNlIjoiZW5oYW5jZSBpbmZvIn0.oMdkFseeIJSZM9ur4iY2BpCrJ_cA_M5q-_oEwSfW7z4",
  5. "expires_in": 59,
  6. "scope": "all",
  7. "enhance": "enhance info",
  8. "jti": "38dd910d-ea23-4e6b-a2d0-4b7ecc39e735"
  9. }

拿着access_token去解析
https://www.box3.cn/tools/jwt.html
image.png

可以发现多了扩展属性