ApiBoot实现零代码整合Spring Security & OAuth2

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

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

ApiBoot Security OAuth简介

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

创建项目

通过Idea开发工具创建一个名为apiboot-security-oauth-zero-code-integrationSpringBoot项目。

添加ApiBoot统一版本依赖

在添加依赖之前我们需要将ApiBoot的统一版本依赖加入到我们项目的pom.xml文件内,如下所示:

<!--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配置文件内添加相关配置,如下所示:

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的整合,使用内存方式时不需要配置一行代码就可以完成自动化的整合。

代码示例

如果您喜欢本篇文章请为源码仓库点个Star,谢谢!!!
本篇文章示例源码可以通过以下途径获取,目录为apiboot-security-oauth-first-application

相关文章
|
16天前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
67 5
|
2月前
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
47 6
|
1月前
|
缓存 监控 Java
|
2月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
558 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
2月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
39 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
4月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
63 0
|
4月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
58 0
|
4月前
|
Java Spring 安全
Spring 框架邂逅 OAuth2:解锁现代应用安全认证的秘密武器,你准备好迎接变革了吗?
【8月更文挑战第31天】现代化应用的安全性至关重要,OAuth2 作为实现认证和授权的标准协议之一,被广泛采用。Spring 框架通过 Spring Security 提供了强大的 OAuth2 支持,简化了集成过程。本文将通过问答形式详细介绍如何在 Spring 应用中集成 OAuth2,包括 OAuth2 的基本概念、集成步骤及资源服务器保护方法。首先,需要在项目中添加 `spring-security-oauth2-client` 和 `spring-security-oauth2-resource-server` 依赖。
57 0
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
218 2
|
23小时前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
28 14