前言
这是一篇关于SpringSecurity OAuth2细节对比的文章,我是在同一个授权服的情况下,资源服分别采用不同的TokenStore策略,获取Authentication,准去的说是在获取authentication.getPrincipal()的时候我发现JWTStore 和RedisStore得到的数据是不一样的,那么这就引起了我的好奇心!
基于Redis的Store
基于JWT的Store
接口代码如下
两个资源服都有这个一样的接口!
@GetMapping(value = "/getPrincipal")
public R getPrincipal(Authentication authentication) {
return R.ok(authentication.getPrincipal());
}
源码分析
前面主流程都是差不多的,在DefaultTokenServices中,出现了区别
基于Redis的Store
基于redis的那么这里的tokenStore是RedisTokenStore对象
RedisTokenStore是通过deserializeAuthentication方法将Redis中的数据序列化后变成OAuth2Authentication对象的
基于JWT的Store
基于redis的那么这里的tokenStore是JwtTokenStore对象
JwtTokenStore是通过extractAuthentication方法将jwtTokenEnhancer.decode(token)解析好token中的数据得到map,然后组装成
OAuth2Authentication
总结
那么实际上造成不同的Store得到的Authentication对象不同就是上面两个对比,不过这个问题是个伪命题,因为正常情况下,资源服的Store应该个授权服保持一致,即使授权服采用Redis方式,资源服可以采用JWT或者Redis两种,那么资源服最好都同一,要么都使用JWT,要么都是用Redis,那么这样就能得到同样的Authentication同时这也验证了
问题
因为基于JwtTokenStore的会通过
接上面那篇文章中的自定义JWTToken模板信息转换器CustomJWTTokenConverter,最终才会调到这里
但是基于Redis的确实没有这个流程,所以这种形式的全局解析器是必须要使用JwtTokenStore的!!!