Spring Security Oauth2 在资源服务器如何获取jwt中的额外信息

在上一篇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群,欢迎加群讨论!
在这里插入图片描述

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Spring Boot Security OAuth2是基于Spring SecurityOAuth2的框架,用于实现授权服务器资源服务器JWT令牌是一个基于JSON的开放标准,用于在各方之间安全地传输信息。 在Spring Boot Security OAuth2实现支持JWT令牌的授权服务器,可以按照以下步骤进行: 1. 添加依赖:在项目的pom.xml文件添加Spring Security OAuth2和JWT的相关依赖。 2. 配置授权服务器:在Spring Boot应用程序的配置文件,配置授权服务器的基本设置,包括端点URL、客户端信息、用户认证信息等。 3. 配置JWT令牌:配置JWT令牌的签名密钥和过期时间等信息。可以使用开源库如jjwt来生成和验证JWT令牌。 4. 创建自定义的认证提供程序:实现自定义的认证提供程序来支持JWT令牌的认证机制。在认证提供程序,可以使用JWT令牌解析并验证请求的令牌信息。 5. 创建自定义的用户详细信息服务:实现自定义的用户详细信息服务,用于从数据库或其他存储获取用户的详细信息。在用户详细信息服务,可以根据JWT令牌信息获取用户信息。 6. 配置授权服务器的访问规则:配置授权服务器的访问规则,包括允许或禁止特定角色或权限的访问。 7. 测试访问授权服务器:使用客户端应用程序发送请求到授权服务器的端点,获取JWT令牌并验证其有效性。 通过以上步骤,可以实现一个支持JWT令牌的授权服务器。该服务器可以提供为客户端应用程序颁发和验证JWT令牌的功能,以实现安全并可靠的用户认证和授权控制。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值