在上一篇Spring Security Oauth2 中实现TokenEnhancer向jwt中添加额外信息中,笔者向大家介绍了如何向jwt中存额外信息(extraInfo) 接下来这篇blog,笔者将和大家一起探讨如何在后代获取这些extraInfo,希望对各位有帮助,如有不正确的地方,请大家指出。
先在access_token中加入这个两个字段message和name;
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
由上面的代码,可知我们在程序中是将额外信息添加到 DefaultOAuth2AccessToken的additionalInformation 中,当然我们取出来的时候,要找到access_token再从中取出来。具体代码如下:
public Map<String, Object> getExtraInfo(OAuth2Authentication auth) {
OAuth2AuthenticationDetails details
= (OAuth2AuthenticationDetails) auth.getDetails();
OAuth2AccessToken accessToken = tokenStore
.readAccessToken(details.getTokenValue());
return accessToken.getAdditionalInformation();
}
其中readAccessToken 方法是将jwt那串很长的字符串读出来。
我们这里的资源服务器和认证服务器是分离的,所以tokenStore要重新配置一下 和 我们在认证服务器中配置一样,代码如下:
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config.tokenServices(tokenServices());
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("signing_key");
return converter;
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}
注意converter.setSigningKey(“signing_key”); 此处的signing_key需要和认证服务器中设定的一致,我们debug走一下。
让我们来看看控制输出了什么:
可以清楚的看到控制台打印出来的name和message。
从上面的代码可以知道,我们需要从tokenValue中解析出来,这样其实开发时候很麻烦,如果直接
从OAuth2Authentication中取出来就比较好,那我们该怎么做呢?这里spring security oauth2的设计者早就为我们预留了一个字段,还记得上面的那个decodedDetails的字段吗,它是null。那我们何不利用一下?将我们跟程序业务相关的信息存进去,取出来就直接get几下就行了,而且debug的时候也能很清楚的看到每个key-value,那怎么实现呢?代码如下:
首先,在资源服务器中自定义一个 访问令牌转换器 CustomAccessTokenConverter,然后将这个CustomAccessTokenConverter添加到ResourceServerConfigurer中。
/**
* @author Cheng Jun
* @version 1.0
* @Description: 定制 AccessToken 转换器,为添加额外信息在服务器端获取做准备
* @date 2018/12/24 16:05
*/
@Component
public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {
@Override
public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
OAuth2Authentication authentication
= super.extractAuthentication(claims);
authentication.setDetails(claims);
return authentication;
}
}
让我们再来重启一下项目,看看结果如何。
这里的decodedDetails已经是我们想要的结果了。
如果此文对你在使用spring security oauth2 中有什么帮助的话,笔者深感欣慰!点赞关注走一走呀,下面的二维码是笔者创建的一个spring security oauth2的qq群,欢迎加群讨论!