oauth2 通过SecurityContextHolder获取用户信息

最近在写oauth2项目,权限模块和资源模块是分离的。在这里获取用户信息的时候出了问题,只能获取到username 。在陷入困境的时候使用token-info-uri验证直接解析失败。最后通过debug一步一步强推到了解决办法。

这里资源服务器用的验证路径是user-info-uri

security:
  oauth2:
    resource:
      loadBalanced: true
      user-info-uri: http://service-auth/users/current
#      token-info-uri: http://service-auth/oauth/check_token
    client:
      client-secret: 123456
      access-token-uri: http://service-auth/oauth/token
      grant-type: client_credentials,password
      scope: all
      client-id: client

解决办法

资源服务器重写PrincipalExtractor

import org.springframework.boot.autoconfigure.security.oauth2.resource.PrincipalExtractor;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author king
 */
@Component
public class FixedPrincipalExtractor implements PrincipalExtractor {
    private static final String PRINCIPAL = "principal";
    @Override
    public Object extractPrincipal(Map<String, Object> map) {
        return map.get(PRINCIPAL);
    }
}

原理

定位OAuth2AuthenticationProcessingFilter类

import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter;

在这里插入图片描述
进入AuthenticationManager类
这里用到的是redis的存储方式,jwt的挨个打断点,我也是一个一个试出来的
在这里插入图片描述
这里,从权限模块能获取到的就是this.tokenServices.loadAuthentication(token);方法
在这里插入图片描述
再往下打断点,进入ResourceServerTokenServices类
选择进入UserInfoTokenServices类
在这里插入图片描述
在这里就找到了我们想要的东西

在这里插入图片描述
直接进入extractPrincipal方法:
而这里就是我们只获取到用户的username的根本原因
在这里插入图片描述
将FixedPrincipalExtractor直接替换掉就能获取到用户的各种信息了

最后:个人觉得这个方法太过暴力,虽然目前还没有遇到什么bug,推荐有别的方法用别的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vace cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值