美文网首页ApiBoot 核心技术Spring Boot 核心技术spring boot
Api架构奥义:ApiBoot实现零代码整合Spring Sec

Api架构奥义:ApiBoot实现零代码整合Spring Sec

作者: 恒宇少年 | 来源:发表于2019-11-12 16:04 被阅读0次

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

    免费教程专题

    恒宇少年在博客整理三套免费学习教程专题,由于文章偏多特意添加了阅读指南,新文章以及之前的文章都会在专题内陆续填充,希望可以帮助大家解惑更多知识点。

    博客原文:http://blog.yuqiyu.com/apiboot-security-oauth-zero-code-integration.html

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

    代码示例

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

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

    相关文章

      网友评论

        本文标题:Api架构奥义:ApiBoot实现零代码整合Spring Sec

        本文链接:https://www.haomeiwen.com/subject/tsdqictx.html