BUG写累了分享下笔记-关于spring-security-oauth2传递的principal对象没有id等自定义属性

只分享思路没有代码
下边是正题
我们进入debug模式,逆向分析这个principal怎么来的.点打上断点看下是哪来的(后面每次请求debug都用’->'代替)
->
在这里插入图片描述
可以看到是一个UsernamePasswordAuthenticationToken的对象,计入这个类可以看到一个构造方法,我们在构造方法内打上断点,看下是谁创建的
->在这里插入图片描述
我们f它可以看到extractAuthentication(Map<String, ?> map)方法,传进来的参数已经没有id啊之类的参数了,我们继续往前翻
在这里插入图片描述
这个类144行的extractAuthentication(Map<String, ?> map)方法,然后是这个资源服务器的起点了,可以看到这么一行代码
Map<String, Object> map = postForMap(checkTokenEndpointUrl, formData, headers);
而这个map里的参数还不是我们想要的,所以就要去授权服务器找了
在这里插入图片描述
目标/oauth/check_token接口,ctrl+h 全局搜索,冲鸭!
在这里插入图片描述
进入接口后可以看到方法内有这几行代码

OAuth2Authentication authentication = resourceServerTokenServices.loadAuthentication(token.getValue());    //获取信息
Map<String, Object> response = (Map<String, Object>)accessTokenConverter.convertAccessToken(token, authentication);    //转换

到底是哪个出了问题呢?
在这里插入图片描述
分析啥?debug它不香嘛?
如果authentication这个对象的参数不是你想要的,就是对应第一种情况,解决方法就是实现UserDetails,然后就是抄袭官方提供的User类
如果authentication没问题继续往下翻在这里插入图片描述
打上断点F5进入,可以看到

response.putAll(userTokenConverter.convertUserAuthentication(authentication.getUserAuthentication()));

这就是参数转换的方法,我们debug跳进去
在这里插入图片描述
可以看到它只是把authentication.getName()存进去了,所以我们要重写这个方法
但是还有一个问题,就是我们怎么把它给应用到框架中
我退回DefaultAccessTokenConverter这个类 搜索userTokenConverter可以看到

public void setUserTokenConverter(UserAuthenticationConverter userTokenConverter) {
     this.userTokenConverter = userTokenConverter;
}

我们只需要set进去就可以了在这里插入图片描述最后就是配到端点了

反面教材效果图在这里插入图片描述


版权声明:本文为weixin_44536909原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。