赞
踩
只分享思路没有代码
下边是正题
我们进入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进去就可以了最后就是配到端点了
反面教材效果图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。