见过这么简单的方式整合SpringSecurity & OAuth2的自定义查询用户吗?
SpringSecurity
整合OAuth2
是开发者公认的资源保护
、服务认证
的最佳搭配伙伴,这对好基友一直在默默的守护着应用服务的安全,根据访问者的不同角色可以颗粒度控制到具体的接口,从而实现权限的细微划分。
而SpringSecurity
框架在安全框架的队伍中算是入门比较高的,虽然Spring
通过SpringBoot
进行了封装,但是使用起来还是有很多容易遗漏的配置,因为配置比较多,让初学者理解起来也比较困难,针对这个问题ApiBoot
对SpringSecurity
以及OAuth2
进行了封装,在基础上极大的简化了配置(只做简化、增强,SpringSecurity
的基础语法、配置还可以正常使用)
ApiBoot Security 系列文章
创建项目
使用IDEA
开发工具创建一个SpringBoot
项目。
ApiBoot
的底层是SpringBoot
,而且ApiBoot
为了支持SpringBoot
的2.2.x
分支,也对应的创建了2.2.x
分支版本。
添加ApiBoot统一依赖
创建完项目后我们需要在pom.xml
添加ApiBoot
的统一版本依赖,如下所示:
1 | <dependencyManagement> |
添加相关依赖
本章我们需要查询数据库内的用户信息进行认证,所以需要在pom.xml
添加数据库相关的依赖,如下所示:
1 | <dependencies> |
在本章使用到了ApiBoot Mybatis Enhance
,具体的使用请访问官方文档ApiBoot MyBatis Enhance使用文档
配置数据源
添加数据库相关的依赖后,在application.yml
文件内添加如下配置信息:
1 | spring: |
配置ApiBoot Security
ApiBoot Security
默认采用的是内存方式
(memory)读取用户信息,我们本章需要修改为JDBC
方式,并且禁用默认读取用户信息
(ApiBoot Security
内部提供了默认的表结构,建表后添加数据即可直接使用用户信息进行认证,详见:ApiBoot Security使用文档)。
在application.yml
配置文件中添加如下配置:
1 | # ApiBoot配置 |
api.boot.security.enable-default-store-delegate
配置参数默认值为true
,也就是会自动读取数据源对应数据库内的api_boot_user_info
用户信息表,当我们设置为false
后需要通过实现ApiBootStoreDelegate
接口来进行自定义查询的用户信息。
配置ApiBoot OAuth
api-boot-starter-security-oauth-jwt
这个依赖内部也默认集成了OAuth2
,而且默认的数据存储方式与Spring Security
一致也是内存方式(memory
),我们本章的主要目的是查询认证用户信息
,而不是客户端信息
,所以我们还是采用默认的内存方式,不过修改下客户端的默认配置信息,在application.yml
文件内添加配置如下所示:
1 | # ApiBoot配置 |
在
ApiBoot
中OAuth2
默认的客户端配置信息,可以通过查看org.minbox.framework.api.boot.autoconfigure.oauth.ApiBootOauthProperties.Client
源码了解详情。
用户认证
配置已经完成,下面我们来编写查询用户信息,将用户信息交给ApiBoot Security
框架进行认证
、生成AccessToken
等操作。
本章使用的持久化框架是ApiBoot MyBatis Enhance
,具体的使用方法请查看官方文档。
创建用户表
我们在数据库内创建一张名为system_user
的系统用户信息表,表结构如下所示:
1 | CREATE TABLE `system_user` ( |
system_user
用户表创建完成后,我们往这张表内添加一条用户数据,如下所示:
1 | INSERT INTO `system_user` VALUES ('9b69fd26-14db-11ea-b743-dcd28627348e','yuqiyu','恒宇少年 - 于起宇','$2a$10$RbJGpi.v3PwkjrYENzOzTuMxazuanX3Qa2hwI/f55cYsZhFT/nX3.','2019-12-02 08:13:22',1); |
我们在登录时用户名对应su_login_name
字段,而密码则是对应su_password
字段,yuqiyu
这个用户的密码初始化为123456
,密码的格式必须为BCryptPasswordEncoder
加密后的密文。
创建用户实体
针对system_user
表我们需要来创建一个ApiBoot MyBatis Enhance
使用的实体,创建一个名为SystemUser
的实体如下所示:
1 |
|
具体的注解使用详见ApiBoot MyBatis Enhance
文档,这里还一点需要注意的是,SystemUser
实现了UserDetails
接口,如果使用过Spring Security
的同学应该都知道这是Spring Security
提供的用户详情接口定义,我们如果自定义查询用户
就应该让我们自定义的用户实体
(注:这是的自定义用户实体也就是SystemUser实体)实现这个接口并全部实现UserDetails
接口内提供的方法。
创建用户数据接口
用户的实体已经创建完成,我们本章需要一个根据用户的登录名
来查询用户基本的数据接口,创建一个名为SystemUserEnhanceMapper
的接口如下所示:
1 | /** |
该接口继承了EnhanceMapper<Entity,ID>
接口,可以自动被扫描到创建代理的实例
后并且加入IOC
,这样我们在项目其他的地方可以直接注入使用。
注意:
findByXxx
方法是ApiBoot MyBatis Enhance
提供的方法命名规则查询,多个查询条件可以使用And
或者Or
追加,会自动根据方法的规则生成对应的SQL
。
实现ApiBootStoreDelegate接口
ApiBoot Security
提供了一个接口ApiBootStoreDelegate
,这个接口主要是用来查询登录用户的具体信息的作用,当我们通过grant_type=password&username=xxx
的方式进行获取AccessToken
时,ApiBoot Security
会直接把username
的参数值传递给ApiBootStoreDelegate#loadUserByUsername
的方法内,这样我们就可以根据username
进行查询用户并返回给ApiBoot Security
做后续的认证操作。
我们来创建一个名为UserService
的类并实现ApiBootStoreDelegate
接口,如下所示:
1 |
|
loadUserByUsername
方法的返回值是UserDetails
接口类型,在之前我们已经将SystemUser
实现了该接口,所以我们可以直接将SystemUser
实例作为返回值。
运行测试
代码一切就绪,通过XxxxApplication
的方式来启动项目。
测试点:获取AccessToken
在获取AccessToken
之前,我们需要确认application.yml
文件内配置的api.boot.oauth.clients
的客户端的clientId
、clientSecret
配置内容,下面是通过CURL
的方式:
1 | ➜ ~ curl hengboy:chapter@localhost:9090/oauth/token -d 'grant_type=password&username=yuqiyu&password=123456' |
测试点:刷新AccessToken
复制上面获取到的refresh_token
的值进行刷新,下面是刷新AccessToken
的CURL
方式:
1 | ➜ ~ curl hengboy:chapter@localhost:9090/oauth/token -d 'grant_type=refresh_token&refresh_token=d2243e18-8ab3-4842-a98f-ebd79da94e2e' |
hengboy
这个OAuth2
客户端在application.yml
中通过配置grantTypes
授权了两种grant_type
,分别是password
、refresh_token
,如果需要别的方式可以在配置文件内对应添加。
敲黑板,划重点
ApiBoot
整合Spring Security
以及OAuth2
后读取自定义用户信息,我们只需要关注具体怎么读取用户信息,之前那些懵懵懂懂的代码配置都可以通过配置文件
的方式代替,本章的主要内容是ApiBootStoreDelegate
这个接口,ApiBoot
所提供的功能还不止这些,会陆续分享给大家。
代码示例
如果您喜欢本篇文章请为源码仓库点个Star
,谢谢!!!
本篇文章示例源码可以通过以下途径获取,目录为apiboot-security-oauth-custom-certification-user
:
见过这么简单的方式整合SpringSecurity & OAuth2的自定义查询用户吗?
https://blog.minbox.org/apiboot-security-oauth-custom-certification-user.html