1.文档内容概要

本文主要对SpringSecurityOauth2的不同令牌进行介绍。通过阅读本文档,你会了解到SpringSecurityOauth2各种令牌的特点。
github:https://github.com/gaoxi-hub/springsecurity-oauth-tokenstore.git

2.令牌的种类

SpringSecurityOauth2令牌 - 图1

3.令牌的作用

1.普通令牌的作用:唯一标识存贮在数据库或内存中的用户信息,在认证时,SpringSecurity拿着普通令牌去数据库中查询用户信息使用
2.jwt令牌的作用:jwt令牌中本身存储着用户信息,在认证时,SpringSecurity从jwt令牌中解析出用户信息即可,不需要借助数据库等进行存储

4.普通令牌

普通令牌是SpringSecurityOauth2给客户端颁发的一个无含义的令牌,在令牌发布时,SpringSecurityOauth2将用户信息存储到程序指定的存储位置,并用普通令牌唯一标识这个存储信息,当用户再次携带令牌访问时,SpringSecurityOauth2会根据令牌查询用户信息,进而实现权限角色的限制。
image.png

4.1普通令牌的存储

普通令牌需要一个存储用户信息的地方,这个地方可以内存,也可以是数据库(Redis、Mysql) SpringSecurityOauth2令牌 - 图3

4.1.1基于内存存储

1.测试用例

测试项 测试结果
同一个认证服务器同一个用户多次调用发布令牌 会返回同一个令牌(access_token、refresh_token)
调用刷新token 1.refresh_token本身是不会变化,无论刷新几次
2.刷新后原access_token立即失效,并生成新的access_token.
多台认证服务器同一个用户多次调用发布令牌 1.不同的认证服务器发布令牌各不相同
用户信息的获取方式 通过调用/oauth/check_token去获取用户认证信息

2.结论
①基于内存存储用户信息的方式,认证服务器将用户信息存储在各自JVM运行时内存中
②当资源服务器获得access_token后,会通过远程调用认证服务器的/oauth/check_token,校验token,获得用户信息
③在微服务场景下不适用
在SpringSecurityOauth2框架下的2个角色,认证服务器和资源服务器的概念映射到bi项目中,如下图所示
image.png

4.1.2基于数据库存储(以Redis为例)

1.测试用例

测试项 测试结果
同一个认证服务器同一个用户多次调用发布令牌 会返回同一个令牌(access_token、refresh_token)
调用刷新token 1.refresh_token本身是不会变化,无论刷新几次
2.刷新后原access_token立即失效,并生成新的access_token.
多台认证服务器同一个用户多次调用发布令牌 1.不同的认证服务器发布令牌是相同的,不论哪个认证服务器,都会返回同一个access_token和refresh_token
用户信息的获取方式 从Redis数据库中获取

2.结论
①基于Redis存储用户信息的方式,认证服务器将用户信息存储到指定的Redis数据库中
②当资源服务获取到access_token时,会到Redis中获取用户信息
③在微服务场景下适用

5.JWT令牌

jwt令牌的方式就无需数据库的介入,jwt令牌中就包含着用户的信息,SpringSecurityOauth在发布令牌时,会将用户信息放入JWT令牌中,用户拿着JWT令牌时,SpringSecurityOauth从中获取到用户信息,实现用户权限的控制。
image.png

5.1JWT令牌的存储

jwt不需要后端进行存储

5.2JWT的特点

测试项 测试结果
同一个认证服务器同一个用户多次调用发布令牌 会返回不同的令牌(access_token、refresh_token)
调用刷新token 1.refresh_token每请求依次就会变一次
2.刷新后原access_token不会失效,并生成新的access_token.
多台认证服务器同一个用户多次调用发布令牌 1.不同的认证服务器发布令牌是不同的
用户信息的获取方式 从JWT令牌中获取

5.3JWT令牌的结论

①基于JWT令牌的认证服务器,用户信息存储到令牌中
②当资源服务获取到access_token后,会解析这个jwt类型的access_token,从中会获取到用户信息
③微服务场景下也不适用