OAuth2在内存、Redis、JDBC方式下的多客户端配置
Spring
所提供的OAuth2
集成策略,支持多种方式存储认证信息
以及客户端信息
,由于在之前的文章中讲解使用时把知识点进行了拆分,有很多同学不太会组合使用,很多单独问我ApiBoot
所提供的OAuth2
的整合后,多个客户端该怎么配置?
本章就来讲讲如果我们使用内存方式
、Redis方式
做OAuth2
相关信息存储时,该如何配置多个客户端!!!
系列文章
ApiBoot
针对每一个组件都提供一系列的拆分详解文章,详情请访问 ApiBoot开源框架各个组件的系列使用文章汇总 。
前言
ApiBoot
集成OAuth2
后内存方式
与Redis方式
的客户端配置都位于application.yml/application.properties
配置文件内,通过源码发现Spring
提供了一个接口 TokenStore 来定义操作认证信息的方法列表,实现该接口后就可以定义不同的存储方式具体的逻辑,当前我们也可以进行自定义,只需要将自定义实现类的实例交付给Spring IOC
进行托管就即可,OAuth2
内部就会调用自定义的实现类来处理业务(在内部都是通过接口来操作,不关心实例是哪个实现类)。
当然Spring
在整合OAuth2
后也提供了一些内置的TokenStore
实现类,如下所示:
InMemoryTokenStore
将
客户端信息
以及生成的AccessToken
存放在内存中,项目重启后之前生成的AccessToken
就会丢失,而ApiBoot OAuth
在项目启动时会自动加载application.yml
配置文件的客户端列表,所以客户端信息不会丢失。JdbcTokenStore
将
客户端信息
以及生成的AccessToken
存放在数据库中,项目重启后不影响认证,表结构由OAuth2
提供。RedisTokenStore
将
客户端信息
以及生成的AccessToken
存放在 Redis中,支持分布式部署,AccessToken
默认过期时间为7200
秒,过期后也会自动被删除,使用起来比较方便,ApiBoot OAuth
只需要修改api.boot.oauth.away=redis
就可以启用这种方式。JwtTokenStore
主要功能是使用
Jwt
进行转换AccessToken
,并不做数据AccessToken
的存储。
客户端配置源码分析
当我们使用ApiBoot OAuth2
提供的内存方式
、Redis方式
来集成使用时,客户端列表的配置都位于application.yml
,使用api.boot.oauth.clients
配置参数进行指定,那这个参数所对应的源码位于 ApiBootOauthProperties 属性配置类内。
在ApiBoot
最初发行版中客户端只允许配置一个,根据使用者的反馈进行了迭代更新后支持了多个客户端的配置,对应ApiBootOauthProperties
属性配置类内的clientis
字段,源码如下所示:
1 | /** |
clients
字段默认值为一个Client
的对象实例,而Client
则是为ApiBootOauthProperties
的一个内部类,如下所示:
1 | /** |
根据Client
类我们也就可以明白了,为什么ApiBoot OAuth
在集成时不配置客户端
也可以使用ApiBoot:ApiBootSecret
来进行获取AccessToken
,因为在ApiBootOauthProperties
属性配置类中有一个默认的Client
对象实例。
注意事项:当我们配置
api.boot.oauth.clients
参数时默认的客户端会被覆盖掉
示例项目
既然我们知道了使用api.boot.oauth.clients
可以配置多个客户端,那么接下来我们创建一个测试的项目,使用IDEA
创建一个SpringBoot
项目,项目pom.xml
文件内容如下所示:
1 | <dependencies> |
配置多客户端
看过ApiBoot OAuth2
系列文章的同学都应该知道,默认使用内存方式
进行存储生成的AccessToken
,这一点我们就不做修改了,如果你项目不是使用默认,可以去参考 ApiBoot开源框架各个组件的系列使用文章汇总 内安全组件分类下的文章。
在application.yml
文件内添加客户端列表配置,如下所示:
1 | api: |
由于
api-boot-starter-security-oauth-jwt
依赖是Spring Security
与OAuth2
的整合,所以我们想要获取AccessToken
需要配置Spring Security
的用户列表,即api.boot.security.users
参数,默认同样是内存方式存储,详见:ApiBoot实现零代码整合Spring Security & OAuth2
运行测试
通过XxxApplication
方式启动本章项目,通过Curl命令测试获取AccessToken
,如下所示:
1 | ➜ ~ curl -X POST minbox:chapter@localhost:8080/oauth/token -d 'grant_type=password&username=yuqiyu&password=123456' |
在上面命令行中,我们通过minbox:chapter
客户端进行测试获取AccessToken
,接下来我们验证是否两个客户端都已经生效,下面使用hengboy:123123
客户端尝试:
1 | ➜ ~ curl -X POST hengboy:123123@localhost:8080/oauth/token -d 'grant_type=password&username=yuqiyu&password=123456' |
根据输出来看,是可以获取到AccessToken
的,多客户端配置都已经生效。
敲黑板,划重点
其实ApiBoot Security OAuth
有很多配置都可以组合使用,不过跨越存储方式的配置有的是无法相互组合使用的,比如:当你使用Jdbc
方式来存储认证信息时,即使我们配置了api.boot.oauth.clients
参数,这时也是没有任何作用的,因为使用数据库方式来读取客户端信息时,OAuth2
通过JdbcClientDetailsService
类从数据库的oauth_client_details
表内查询客户端列表,我们如果想要添加客户端,这时就需要向oauth_client_details
表内添加一条数据。
代码示例
如果您喜欢本篇文章请为源码仓库点个Star
,谢谢!!!
本篇文章示例源码可以通过以下途径获取,目录为apiboot-oauth-multiple-client-config
:
OAuth2在内存、Redis、JDBC方式下的多客户端配置
https://blog.minbox.org/apiboot-oauth-multiple-client-config.html