1.文档内容概要
本文主要对SpringSecurityOauth2的不同令牌进行介绍。通过阅读本文档,你会了解到SpringSecurityOauth2各种令牌的特点。
github:https://github.com/gaoxi-hub/springsecurity-oauth-tokenstore.git
2.令牌的种类
3.令牌的作用
1.普通令牌的作用:唯一标识存贮在数据库或内存中的用户信息,在认证时,SpringSecurity拿着普通令牌去数据库中查询用户信息使用
2.jwt令牌的作用:jwt令牌中本身存储着用户信息,在认证时,SpringSecurity从jwt令牌中解析出用户信息即可,不需要借助数据库等进行存储
4.普通令牌
普通令牌是SpringSecurityOauth2给客户端颁发的一个无含义的令牌,在令牌发布时,SpringSecurityOauth2将用户信息存储到程序指定的存储位置,并用普通令牌唯一标识这个存储信息,当用户再次携带令牌访问时,SpringSecurityOauth2会根据令牌查询用户信息,进而实现权限角色的限制。
4.1普通令牌的存储
普通令牌需要一个存储用户信息的地方,这个地方可以内存,也可以是数据库(Redis、Mysql)
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项目中,如下图所示
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从中获取到用户信息,实现用户权限的控制。
5.1JWT令牌的存储
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,从中会获取到用户信息
③微服务场景下也不适用