SpringBootSecurity学习(19)前后端分离版之OAu…
2019-10-12 08:33:50来源:博客园 阅读 ()
SpringBootSecurity学习(19)前后端分离版之OAuth2.0 token的存储和管理
内存中存储token
我们来继续授权服务代码的下一个优化。现在授权服务中,token的存储是存储在内存中的,我们使用的是 InMemoryTokenStore :
图中的tokenStore方法支持很多种令牌的存储方式,来看一下:
InMemoryTokenStore:这个版本的实现是被默认采用的,它可以完美的工作在单服务器上(即访问并发量压力不大的情况下,并且它在失败的时候不会进行备份),大多数的项目都可以使用这个版本的实现来进行尝试,你可以在开发的时候使用它来进行管理,因为不会被保存到磁盘中,所以更易于调试。
JwtTokenStore:这个版本的全称是 JSON Web Token(JWT),它可以把令牌相关的数据进行编码(因此对于后端服务来说,它不需要进行存储,这将是一个重大优势),但是它有一个缺点,那就是撤销一个已经授权令牌将会非常困难,所以它通常用来处理一个生命周期较短的令牌以及撤销刷新令牌(refresh_token)。另外一个缺点就是这个令牌占用的空间会比较大,如果你加入了比较多用户凭证信息。JwtTokenStore 不会保存任何数据,但是它在转换令牌值以及授权信息方面与 DefaultTokenServices 所扮演的角色是一样的。
JdbcTokenStore:这是一个基于JDBC的实现,令牌会被保存进关系型数据库。使用这个实现时,你可以在不同的服务器之间共享令牌信息,使用的时候请注意把"spring-jdbc"这个依赖加入到你的classpath当中。
RedisTokenStore : 这是一个基于Redis的实现,令牌会被保Redis缓存中。使用这个实现时,你可以在不同的服务器之间共享令牌信息,使用的时候请注意把redis依赖加入到你的classpath当中。关于redis和数据库存储数据有什么不同和需要注意的地方,这里不再描述。
默认的 InMemoryTokenStore 方式存储也是可以进行查询和删除的,我们来看一下,首先将 InMemoryTokenStore 配置为一个bean:
然后配置时调用这个bean:
我们来看一下 InMemoryTokenStore 类中对token有哪些操作:
从方法的名字可以看出,对token的增删改查操作基本都是齐全的,我们来写两个方法查询和删除token:
类中注入的InMemoryTokenStore正是前面定义的bean,只有这样才能操作内存中的token,下面来看一下测试,先根据前面的流程,申请到令牌,然后查询令牌:
然后测试删除令牌:
然后再根据令牌查询受保护的资源,可以发现无法访问了。
使用内存的方式虽然基本的功能都在,但是缺点上面也提到了,就是只能工作在单服务器上面,无法默认实现token共享,另外测试环境使用内存存储也是比较好的选择。
Redis存储token
令牌除了可以存储在内存中,还可以存储在公共的地方,比如redis中,这样单服务器数据不同步的问题可以解决。存储在redis中首先要引入依赖:
然后配置数据源:
然后修改授权配置类,配置redis存储的bean:
这样redis存储token的配置基本就完成了,然后仿照前面的内存存储操作,写两个接口用来查询和删除redis中的token:
启动项目,按照之前的流程获取令牌,访问保护资源,然后查看redis,可以看到里面存储了我们获取的令牌:
来看查询token接口的效果:
来看删除token接口的效果:
删除后,redis中的token也删除了:
只剩下三个刷新的key。
JDBC存储token
使用jdbc存储token的方式也可以做到token共享,操作类是 JdbcTokenStore ,我们来看一下这个类:
类中定义了好多默认操作的sql语句,总共涉及到两张表:oauth_access_token和oauth_refresh_token(如果客户端的grant_type不支持refresh_token,则不会使用该表),来看一下 oauth_access_token 表的结构:
token_id:该字段的值是将access_token的值通过MD5加密后存储的
token:存储将OAuth2AccessToken.java对象序列化后的二进制数据, 是真实的AccessToken的数据值
authentication_id:该字段具有唯一性, 其值是根据当前的username(如果有),client_id与scope通过MD5加密生成的. 具体实现请参考DefaultAuthenticationKeyGenerator.java类
user_name:登录时的用户名, 若客户端没有用户名(如grant_type="client_credentials"),则该值等于client_id
client_id:你懂得
authentication:存储将OAuth2Authentication.java对象序列化后的二进制数据
refresh_token :该字段的值是将refresh_token的值通过MD5加密后存储的
来看一下 oauth_refresh_token 表的字段结构:
token_id:该字段的值是将refresh_token的值通过MD5加密后存储的.
token:存储将OAuth2RefreshToken.java对象序列化后的二进制数据.
authentication:存储将OAuth2Authentication.java对象序列化后的二进制数据
在数据库中创建这两张表:
然后在pom中引入jdbc依赖,在配置文件中配置数据源,此处不再演示。下一步修改授权配置类:
最后仿照前面,写两个查询和删除token的接口:
使用数据库存储token,比前面两种方式多了很多方法和操作,来看 JdbcTokenStore 类:
除了增删改查的操作多了几个方法,包括sql语句的默认写法也有覆盖的set方法。下面来测试,首先按照前面的流程获取token令牌,然后查询数据库:
可以看到数据库中多了两条token数据,看一下查询token接口:
删除接口:
看一下删除接口调用的方法源码:
只是删除了令牌,更新token的记录还会保留。
代码地址: https://gitee.com/blueses/spring-boot-security 23 24
本文由博客一文多发平台 OpenWrite 发布!
原文链接:https://www.cnblogs.com/guos/p/11655036.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:感想
- 学习Java 8 Stream Api (4) - Stream 终端操作之 collect 2020-06-11
- java学习之第一天 2020-06-11
- Java学习之第二天 2020-06-11
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Ap 2020-06-11
- Linux简单命令的学习 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash