ApiBoot Security 内部提供了 两种方式 进行读取需要认证的用户信息,在之前的文章中讲到过 ApiBoot Security 使用 内存方式(memory) 不写一行代码 就可以实现用户的认证并获取 AccessToken ,那我们使用 JDBC 方式是不是也是这么的简单呢?
如果你还对 ApiBoot 不了解,可以通过以下的途径来获取帮助。
有一些同学可能对 ApiBoot Security 的两种认证方式还不太了解,下面介绍下这两种认证方式的区别。
内存方式(memory) 是将用户信息(用户名、密码、角色列表)在 application.yml 文件内配置,可配置多个用户,项目启动后将用户信息加载到内存中,用于获取 AccessToken 时的认证。
数据库方式(jdbc) 是将用户信息保存到数据库内, ApiBoot Security 定义了一个默认表结构的 用户信息数据表 ,我们可以从官网找到 建表语句 直接在自己的数据库内创建即可,当然如果不使用默认的表结构可以进行自定义读取用户信息。
注意:在数据库内存放用户的 密码 必须是通过 BCryptPasswordEncoder 加密后的密文字符串。
对 ApiBoot Security 的两种认证方式概念明白后,我们开始说下怎么才能使用 JDBC 方式进行用户认证,我们先来使用 IDEA 开发工具创建一个 SpringBoot 项目。
在使用 ApiBoot 内提供的组件依赖时,首先我们需要在 pom.xml 文件内添加 ApiBoot统一版本 ,如下所示:
<properties>
<java.version>1.8</java.version>
<!--ApiBoot版本号-->
<apiboot.version>2.1.5.RELEASE</apiboot.version>
</properties>
<dependencyManagement>
<dependencies>
<!--ApiBoot版本依赖-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-dependencies</artifactId>
<version>${apiboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在项目 pom.xml 文件添加 ApiBoot Security 依赖,如下所示:
<!--ApiBoot Security OAuth--> <dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-starter-security-oauth-jwt</artifactId> </dependency>
我们本章使用 MySQL 数据库做演示,我们需要添加相关的 数据库依赖 以及数据库 连接池依赖 ,由于 ApiBoot Security 读取内置的默认用户表结构使用的是 DataSource ,所以我们还需要添加一个可以实例化 DataSource 的依赖,可以选择 api-boot-starter-mybatis-enhance 或者 spring-boot-starter-jdbc ,在 pom.xml 添加依赖如下所示:
<!--SpringBoot Web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--MySQL--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--Hikari--> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <!--SpringBoot JDBC--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
注意: spring-boot-starter-web 这个依赖不可少,在 ApiBoot AutoConfiguration 内需要一些 Web 的依赖类。
本章使用 ApiBoot Security 提供的默认用户表结构,访问官方文档查看 3.3 使用内置表结构的用户 ,将建表语句在自己数据库内执行创建表信息,创建后添加一条用户信息,如下所示:
INSERT INTO `api_boot_user_info` VALUES (1,'admin','昵称','$2a$10$RbJGpi.v3PwkjrYENzOzTuMxazuanX3Qa2hwI/f55cYsZhFT/nX3.',NULL,NULL,NULL,'N','Y','O','2019-11-29 06:14:44');
依赖添加完成后我们在 application.yml 配置文件内进行配置数据源,如下所示:
spring:
application:
name: apiboot-security-customize-select-user
# 数据源配置
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
server:
port: 9090
由于 ApiBoot Security 默认使用 memory 用户认证读取方式,我们需要在 application.yml 文件内进行修改,如下所示:
# ApiBoot相关配置
api:
boot:
# 启用ApiBoot Security 的JDBC方式
security:
away: jdbc
项目配置完成,下面我们通过 XxxApplication 方式启动项目。
在获取 AccessToken 之前我们要知道的一点, ApiBoot Security 内部默认集成了 OAuth2 ,而且还默认配置了 clientId 、 clientSecret 客户端基本信息,默认值分别是 ApiBoot 、 ApiBootSecret 。
clientId = ApiBoot clientSecret = ApiBootSecret
如果你对 ApiBoot OAuth 其他功能有兴趣可以查看 ApiBoot OAuth文档 了解详情。
由于学习者的本机环境不同,下面采用两种方式进行获取 AccessToken 。
执行如下命令获取 AccessToken :
➜ ~ curl -X POST ApiBoot:ApiBootSecret@localhost:9090/oauth/token/?grant_type/=password/&username/=admin/&password/=123456
{"access_token":"d9cb97ee-d1bf-42e1-a7a0-c1002df48c52","token_type":"bearer","refresh_token":"db9e9d52-cbe3-4379-a5f2-ffaa34681c01","expires_in":2884,"scope":"api"}
注意:获取AccessToken的请求方式为 POST .
ApiBoot Security 不仅 内存方式 可以实现 零代码 的方式进行集成 Spring Security 、 OAuth2 , JDBC 方式同样也可以,不过要根据 ApiBoot 的约定创建用户表。
本篇文章示例源码可以通过以下途径获取,目录为 SpringBoot2.x/apiboot-security-customize-select-user :
作者个人 博客
使用开源框架 ApiBoot 助你成为Api接口服务架构师