ApiBoot零代码整合Spring Security的JDBC方式获取AccessToken

泄露秘密 提交于 2019-11-30 19:38:29

ApiBoot Security内部提供了两种方式进行读取需要认证的用户信息,在之前的文章中讲到过ApiBoot Security使用内存方式(memory)不写一行代码就可以实现用户的认证并获取AccessToken,那我们使用JDBC方式是不是也是这么的简单呢?

如果你还对ApiBoot不了解,可以通过以下的途径来获取帮助。

ApiBoot Security的认证方式

有一些同学可能对ApiBoot Security的两种认证方式还不太了解,下面介绍下这两种认证方式的区别。

内存方式

内存方式(memory)是将用户信息(用户名、密码、角色列表)在application.yml文件内配置,可配置多个用户,项目启动后将用户信息加载到内存中,用于获取AccessToken时的认证。

数据库方式

数据库方式(jdbc)是将用户信息保存到数据库内,ApiBoot Security定义了一个默认表结构的用户信息数据表,我们可以从官网找到建表语句直接在自己的数据库内创建即可,当然如果不使用默认的表结构可以进行自定义读取用户信息。

注意:在数据库内存放用户的密码必须是通过BCryptPasswordEncoder加密后的密文字符串。

创建项目

ApiBoot Security的两种认证方式概念明白后,我们开始说下怎么才能使用JDBC方式进行用户认证,我们先来使用IDEA开发工具创建一个SpringBoot项目。

添加ApiBoot统一版本

在使用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>

添加ApiBoot Security依赖

在项目pom.xml文件添加ApiBoot Security依赖,如下所示:

<!--ApiBoot Security OAuth-->
<dependency>
  <groupId>org.minbox.framework</groupId>
  <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
</dependency>

添加JDBC相关依赖

我们本章使用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

配置ApiBootSecurity JDBC方式

由于ApiBoot Security默认使用memory用户认证读取方式,我们需要在application.yml文件内进行修改,如下所示:

# ApiBoot相关配置
api:
  boot:
    # 启用ApiBoot Security 的JDBC方式
    security:
      away: jdbc

运行测试

项目配置完成,下面我们通过XxxApplication方式启动项目。

在获取AccessToken之前我们要知道的一点,ApiBoot Security内部默认集成了OAuth2,而且还默认配置了clientIdclientSecret客户端基本信息,默认值分别是ApiBootApiBootSecret

clientId = ApiBoot
clientSecret = ApiBootSecret

如果你对ApiBoot OAuth其他功能有兴趣可以查看ApiBoot OAuth文档了解详情。

获取AccessToken

由于学习者的本机环境不同,下面采用两种方式进行获取AccessToken

CURL方式

执行如下命令获取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"}

PostMan方式

注意:获取AccessToken的请求方式为POST.

敲黑板,划重点

ApiBoot Security不仅内存方式可以实现零代码的方式进行集成Spring SecurityOAuth2JDBC方式同样也可以,不过要根据ApiBoot的约定创建用户表。

代码示例

本篇文章示例源码可以通过以下途径获取,目录为SpringBoot2.x/apiboot-security-customize-select-user

作者个人 博客 使用开源框架 ApiBoot 助你成为Api接口服务架构师

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!