前面我们我们在集成Oauth2功能的的时候,授权码和客户端信息都是保存在内存中的,但是在生产环境下,这些信息都应该保存在数据库中,否则服务重启后,内存信息都会清空,而且不方便配置。
1、数据库表
首先我们需要新建2张表来保存授权码和客户端信息:
1 | CREATE TABLE `oauth_client_details` ( |
表中插入数据:
1 | INSERT INTO `activiti-demo`.`oauth_client_details`(`client_id`, `resource_ids`, `client_secret`, `scope`, `authorized_grant_types`, `web_server_redirect_uri`, `authorities`, `access_token_validity`, `refresh_token_validity`, `additional_information`, `create_time`, `archived`, `trusted`, `autoapprove`) VALUES ('activiti-rest', 'activiti-rest,activiti-web,activiti-auth', '$2a$10$RwjayO3IOpr0L8t8We2YC.FoEodRUQJowNPsOOKmkF8hZ4Mfn/V8y', 'ROLE_ADMIN,ROLE_USER,ROLE_API', 'client_credentials,password,authorization_code,implicit,refresh_token', 'https://www.baidu.com', NULL, 7200, 259200, NULL, '2020-09-28 13:50:46', 0, 0, 'true'); |
此处定义了2个客户端信息,其中的client_secret
字段,明文是123456,此处需要保存加密后的字符串,因为我们代码中使用的是BCryptPasswordEncoder
加密,所以使用如下方法即可获取加密串:
1 |
|
2、认证服务器集成Mybatis-Plus、Druid
因为涉及到了数据库操作,所以我们需要在认证服务器中集成Mybatis-plus。这个集成步骤在前面搭建workflow-activiti-rest服务时已经介绍过了。
2.1 添加依赖
在workflow-auth
服务的pom中添加:
1 | <dependency> |
2.2 spy.properties
在src/main/resources/spy.properties
路径下新建spy.properties文件。用于格式化SQL语句。
spy.properties内容如下:
1 | appender=com.p6spy.engine.spy.appender.Slf4JLogger |
2.3 修改配置
1 | # mybatis-plus相关配置 |
2.4 Druid配置
将workflow-activiti-rest服务config目录下的DruidConfiguration.java拷贝到workflow-auth的config目录下:
3、修改资源拦截配置
我们需要修改一下资源配置类ResourceServerConfig
,将druid、swagger等资源放行。
1 |
|
4、修改授权服务
4.1 修改AuthorizationServerConfig
之前的客户端信息、授权码服务,我们是这样配置的:
1 | /** |
现在我们修改为:
1 |
|
另外,我们上面重新定义了ClientDetailsService ,会和org/springframework/security/oauth2/config/annotation/configuration/ClientDetailsServiceConfiguration.class
中的Bean冲突:
启动会报如下错误:
1 | The bean 'clientDetailsService', defined in class path resource [org/sxdx/workflowauth/config/AuthorizationServerConfig.class], could not be registered. A bean with that name has already been defined in BeanDefinition defined in class path resource [org/springframework/security/oauth2/config/annotation/configuration/ClientDetailsServiceConfiguration.class] and overriding is disabled. |
此处我们添加如下配置来解决这个问题:l
1 | spring: |
这样就修改为通过数据库保存client和code信息了。可以发现,此处我们并没有指定表名,那么不需要告诉程序从那张表获取数据吗,不需要,这是因为Oauth2已经设置了默认的表名和表结构,我们只需创建好对应的表即可。
表结构可以参考github:https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql
5、验证
我们重启服务后验证授权码模式。
此时查看oauth_code
表:
可以看到授权码已经保存到了数据库中。我们使用code获取token:
我们还需要设置请求头,key为Authorization,value为Basic加上client_id:client_secret经过base64加密后的值(可以使用http://tool.chinaz.com/Tools/Base64.aspx)
可以看到我们成功获取了token。
此时再次查看oauth_code
表:
发现记录已经被清空了。