SpringSecurity OAuth2 资源服关于JWT Token和Redis Token的区别

前言

这是一篇关于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的!!!


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