Api架构奥义:ApiBoot实现零代码整合Spring Security & OAuth2

接口服务的安全性一直是程序员比较注重的一个问题,成熟的安全框架也比较多,其中一个组合就是Spring SecurityOAuth2的整合,在ApiBoot内经过代码的封装、自动化配置实现了自动化整合这两大安全框架。html

博客原文:blog.yuqiyu.com/apiboot-sec…java

ApiBoot Security OAuth简介

ApiBoot Security OAuthApiBoot开源项目内的一个组件,内部经过SpringBoot AutoConfiguration整合了Spring SecurityOAuth2,并且支持多种存储方式,如:内存(memory)数据库(jdbc)Redis等,使用配置文件的方式来代替代码侵入式集成方式,提升开发效率、减小非业务的繁琐代码,并且还有这比较高的可扩展性。git

建立项目

经过Idea开发工具建立一个名为apiboot-security-oauth-zero-code-integrationSpringBoot项目。数据库

添加ApiBoot统一版本依赖

在添加依赖以前咱们须要将ApiBoot的统一版本依赖加入到咱们项目的pom.xml文件内,以下所示:api

<!--ApiBoot统一版本依赖-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.minbox.framework</groupId>
            <artifactId>api-boot-dependencies</artifactId>
            <version>2.1.5.RELEASE</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>
复制代码

添加ApiBoot Security OAuth依赖

添加完成版本依赖后,咱们继续在pom.xml文件内添加ApiBoot Security OAuth依赖,以下所示:安全

<dependencies>
  <!--SpringBoot Web-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <!--ApiBoot Security Oauth-->
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
  </dependency>
</dependencies>
复制代码

配置ApiBoot Security用户列表

ApiBoot Security默认支持内存方式(memory)配置用户列表,用于整合OAuth2密码受权方式(grant_type=password),咱们须要在application.yml配置文件内添加相关配置,以下所示:bash

spring:
 application:
 name: apiboot-security-oauth-first-application
server:
 port: 9090
# ApiBoot 相关配置
api:
 boot:
    # ApiBoot Security配置
 security:
      # 配置内存用户列表
 users:
 - username: hengboy
 password: 123456
 - username: yuqiyu
 password: 123123
复制代码

经过api.boot.security.users参数能够配置多个用户信息,每一个用户可配置usernamepasswordroles,能够经过查看org.minbox.framework.api.boot.autoconfigure.security.ApiBootSecurityProperties源码类了解详情。

  • username:配置Spring Security用户的用户名。
  • password:配置Spring Security用户的密码。
  • roles:配置Spring Security用户对应受权的角色列表,多个可使用英文半角,隔开,或者使用-方式配置。

运行测试

咱们经过XxxApplication方式启动本章项目。

测试点:获取AccessToken

项目运行成功后咱们先来测试下是否能够获取到AccessToken

Curl方式获取:

➜ ~ curl -X POST ApiBoot:ApiBootSecret@localhost:9090/oauth/token -d "grant_type=password&username=hengboy&password=123456"
{"access_token":"f16202f7-ab8c-41ae-86be-e314aebe82ff","token_type":"bearer","refresh_token":"93c74812-ec5b-4676-8378-b68e4c1751ae","expires_in":3297,"scope":"api"}
复制代码

PostMan方式获取:

若是对Spring SecurityOAuth2整合有必定经验的同窗应该明白grant_typeOAuth2内提供的其中一种受权方式,而参数usernamepassword则是整合后对应的Spring Security用户名以及密码,也就是咱们在application.yml配置文件api.boot.security.users配置用户列表的其中一个用户信息

在上面分别经过CurlPostMan两种方式进行测试获取AccessToken,都是能够直接获取到的。

测试点:获取当前用户信息

ApiBoot Security OAuth获取当前用户信息的方式与Spring Security同样,经过注入java.security.Principal接口来完成,下面咱们建立一个名为UserController的控制器来测试下效果:

package org.minbox.chapter.apiboot.security.oauth.first.application;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;

/** * 登陆用户信息 * * @author 恒宇少年 */
@RestController
@RequestMapping(value = "/api/user")
public class UserController {

    /** * 获取当前登陆的用户信息 * 经过Spring Security提供的注解{@link PreAuthorize}进行验证角色 * * @param principal {@link Principal} * @return {@link Principal#getName()} */
    @GetMapping
    @PreAuthorize("hasRole('api')")
    public String info(Principal principal) {
        return principal.getName();
    }
}
复制代码

注意:ApiBoot Security OAuth默认权限拦截的路径时/api/**,因此咱们在测试控制器上配置了/api/user做为路径前缀,若是想对ApiBoot Security OAuth详细了解,请访问ApiBoot官网文档ApiBoot Security使用文档

咱们经过Curl方式访问http://localhost:9090/api/user接口效果以下:

➜ ~ curl http://localhost:9090/api/user -H 'Authorization: Bearer d73e86a8-892f-42c1-bc95-04aedfe97828'
hengboy
复制代码

访问/api/user路径的AccessToken是经过用户hengboy用户生成的,因此该接口返回了hengboy用户名。

敲黑板,划重点

ApiBoot Security OAuth极其简单的完成了Spring SecurityOAuth2的整合,使用内存方式时不须要配置一行代码就能够完成自动化的整合。

代码示例

本篇文章示例源码能够经过如下途径获取,目录为SpringBoot2.x/apiboot-security-oauth-first-application

做者我的 博客 使用开源框架 ApiBoot 助你成为Api接口服务架构师

相关文章
相关标签/搜索