ApiBoot - ApiBoot Security Oauth 依赖使用文档

ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接口开发者可以选着性完成开箱即用, 不再为搭建接口框架而犯愁,从而极大的提高开发效率。

引入 ApiBoot Security Oauth

pom.xml配置文件内添加如下:

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

ApiBoot所提供的依赖都不需要添加版本号,但是需要添加版本依赖,具体查看ApiBoot版本依赖

配置参数列表

ApiBoot在整合SpringSecurityOauth2时把配置参数进行了分离,配置列表如下所示:

整合SpringSecurity配置列表

配置名称

介绍

默认值

生效方式

api.boot.security.away

SpringSecurity读取用户的方式,默认为内存方式

memory

all

api.boot.security.auth-prefix

拦截的接口路径前缀,如:/api/users就会被默认拦截

/api/**

memory/jdbc

api.boot.security.users

配置用户列表,具体使用查看内存方式介绍

memory

api.boot.security.ignoring-urls

Spring Security所排除的路径,默认排除Swagger、Actuator相关路径前缀

/v2/api-docs<br />/swagger-ui.html<br />/swagger-resources/configuration/security<br />/META-INF/resources/webjars/<br />/swagger-resources<br />/swagger-resources/configuration/ui<br />/actuator/

memory/jdbc

api.boot.security.enable-default-store-delegate

仅在Jdbc方式生效

true

jdbc

整合Oauth2配置列表

配置名称

介绍

默认值

绑定away

api.boot.oauth.away

Oauth存储Token、读取Client信息方式

memory

all

api.boot.oauth.cleint-id

Oauth2 Client ID

ApiBoot

memory

api.boot.oauth.client-secret

Oauth2 Client Secret

ApiBootSecret

memory

api.boot.oauth.grant-types

客户端授权方式

Srtring[]{"password"}

memory

api.boot.oauth.scopes

客户端作用域

String[]{"api"}

memory

api.boot.oauth.jwt.enable

是否启用JWT格式化AccessToken

false

memory/jdbc

api.boot.oauth.jwt.sign-key

使用JWT格式化AccessToken时的签名

ApiBoot

memory/jdbc

ApiBoot在整合SpringSecurityOauth2时配置进行了分离,也就意味着我们可以让SpringSecurity读取内存用户、Oauth2将生成的AccessToken存放到数据库,当然反过来也是可以的,相互不影响!!!

内存方式(默认方式)

Spring Security

ApiBoot在整合Spring Security的内存方式时,仅仅需要配置api.boot.security.users用户列表参数即可,就是这么的简单,

配置用户示例如下所示:

api:
  boot:
    security:
      # Spring Security 内存方式用户列表示例
      users:
        - username: hengboy
          password: 123456
        - username: apiboot
          password: abc321

api.boot.security.users是一个List<SecurityUser>类型的集合,所以这里可以配置多个用户。

Oauth2

如果全部使用默认值的情况话不需要做任何配置!!!

Jdbc方式

前提:项目需要添加数据源依赖。

Spring Security

默认用户表

ApiBoot在整合Spring Security的Jdbc方式时,在使用ApiBoot提供的默认结构用户表时只需要修改api.boot.security.away: jdbc即可,ApiBoot提供的用户表结构如下所示:

CREATE TABLE `api_boot_user_info` (
  `UI_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号,主键自增',
  `UI_USER_NAME` varchar(30) DEFAULT NULL COMMENT '用户名',
  `UI_NICK_NAME` varchar(50) DEFAULT NULL COMMENT '用户昵称',
  `UI_PASSWORD` varchar(255) DEFAULT NULL COMMENT '用户密码',
  `UI_EMAIL` varchar(30) DEFAULT NULL COMMENT '用户邮箱地址',
  `UI_AGE` int(11) DEFAULT NULL COMMENT '用户年龄',
  `UI_ADDRESS` varchar(200) DEFAULT NULL COMMENT '用户地址',
  `UI_IS_LOCKED` char(1) DEFAULT 'N' COMMENT '是否锁定',
  `UI_IS_ENABLED` char(1) DEFAULT 'Y' COMMENT '是否启用',
  `UI_STATUS` char(1) DEFAULT 'O' COMMENT 'O:正常,D:已删除',
  `UI_CREATE_TIME` timestamp NULL DEFAULT current_timestamp() COMMENT '用户创建时间',
  PRIMARY KEY (`UI_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='ApiBoot默认的用户信息表';

自定义用户表

如果你的系统已经存在了自定义用户表结构,ApiBoot是支持的,而且很简单就可以完成整合,我们需要先修改api.boot.security.enable-default-store-delegate参数为false,如下所示:

api:
  boot:
    security:
      # Spring Security jdbc方式用户列表示例
      enable-default-store-delegate: false
      away: jdbc

添加ApiBootStoreDelegate接口实现类,如下所示:

@Component
public class DisableDefaultUserTableStoreDelegate implements ApiBootStoreDelegate {

    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * 用户列表示例
     * 从该集合内读取用户信息
     * 可以使用集合内的用户获取access_token
     */
    static List<String> users = new ArrayList() {
        {
            add("api-boot");
            add("hengboy");
            add("yuqiyu");
        }
    };

    /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if (!users.contains(username)) {
            throw new UsernameNotFoundException("用户:" + username + "不存在");
        }
        return new DisableDefaultUserDetails(username);
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class DisableDefaultUserDetails implements UserDetails {
        private String username;

        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return new ArrayList() {
                {
                    add((GrantedAuthority) () -> "ROLE_USER");
                }
            };
        }

        /**
         * 示例密码使用123456
         *
         * @return
         */
        @Override
        public String getPassword() {
            return passwordEncoder.encode("123456");
        }

        @Override
        public String getUsername() {
            return username;
        }

        @Override
        public boolean isAccountNonExpired() {
            return true;
        }

        @Override
        public boolean isAccountNonLocked() {
            return true;
        }

        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }

        @Override
        public boolean isEnabled() {
            return true;
        }
    }
}

根据上面代码示例,我们可以通过users用户列表进行访问获取access_token

Oauth2

创建Oauth所需表结构

Oauth2如果使用Jdbc方式进行存储access_tokenclient_details时,需要在数据库内初始化Oauth2所需相关表结构,oauth-mysql.sql

添加客户端数据

初始化Oauth2表结构后,需要向oauth_client_details表内添加一个客户端信息,下面是对应ApiBoot Security Oauth配置信息的数据初始化,如下所示:

INSERT INTO `oauth_client_details` VALUES ('ApiBoot','api','$2a$10$M5t8t1fHatAj949RCHHB/.j1mrNAbxIz.mOYJQbMCcSPwnBMJLmMK','api','password',NULL,NULL,7200,7200,NULL,NULL);

AppSecret加密方式统一使用BCryptPasswordEncoder,数据初始化时需要注意。

在上面memory/jdbc两种方式已经配置完成,接下来我们就可以获取access_token

获取AccessToken

通过CURL获取

➜  ~ curl ApiBoot:ApiBootSecret@localhost:8080/oauth/token -d "grant_type=password&username=api-boot&password=123456"

{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTMxMDk1MjMsInVzZXJfbmFtZSI6ImFwaS1ib290IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjBmZTUyY2RlLTBhZjctNDI1YS04Njc2LTFkYTUyZTA0YzUxYiIsImNsaWVudF9pZCI6IkFwaUJvb3QiLCJzY29wZSI6WyJhcGkiXX0.ImqGZssbDEOmpf2lQZjLQsch4ukE0C4SCYJsutfwfx0","token_type":"bearer","expires_in":42821,"scope":"api","jti":"0fe52cde-0af7-425a-8676-1da52e04c51b"}

启用JWT

ApiBoot Security Oauth在使用JWT格式化access_token时非常简单的,配置如下所示:

api:
  boot:
    oauth:
      jwt:
        # 开启Jwt转换AccessToken
        enable: true
        # 转换Jwt时所需加密key,默认为ApiBoot
        sign-key: 恒宇少年 - 于起宇

默认不启用JWTsign-key签名建议进行更换。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维经验分享

linux tomcat 无法关闭 :8005端口未启动

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25283709/article/details/550...

27020
来自专栏大嘴说编程

SQL注入漏洞全接触--入门篇

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写...

20230
来自专栏黑客秘密

Linux CentOS删除或重命名文件夹和文件的办法

Linux、CentOS操作系统下如何删除和重命名文件夹呢?办法如下: 一、Linux、CentOS下重命名文件和文件夹 mv:move 用移动文件命令就可...

34710
来自专栏ascii0x03的安全笔记

深入理解Amazon Alexa Skill(三)

Alexa会发给skill用户的token,然后skill代码使用这个token来访问Web API访问用户的Alexa内的功能,如list等。

56330
来自专栏囍冯总囍

[WaferOnSCF]在SCF上的小程序会话服务器

本人小白,完全不懂PHP,原项目在代码层面无法支持多个小程序或公众号,所以在此做了修改和适配。本项目可搭配官方Wafer的客户端SDK使用,但客户端SDK需要做...

24520
来自专栏大嘴说编程

SQL注入漏洞全接触--进阶篇

其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:

11630
来自专栏李珣

Exchange Server 2013配置邮件流与外部访问

继前面完成了Exchange Server 2013的安装部署,后续需要对服务器进行一系列的基本配置,来满足我们发送邮件和外部客户端访问的需求。下面来进行相关的...

12920
来自专栏林德熙的博客

win10 uwp 存放网络图片到本地 下载图片保存图片从本地打开所有代码Nuget安装Microsoft.Toolkit.Uwp

有时候我们的网络很垃圾,我的的UWP要在第一次打开网络图片,就把图片存放到本地,下次可以从本地打开。 有时候用户使用的是流量网络,不能每次都联网下载。 我们不得...

18210
来自专栏运维经验分享

tomcat shutdown.sh结束不了,Could not contact localhost:8005

使用./shutdown.sh关闭Tomcat,有时会关闭成功,有时会出现关闭错误;

23040
来自专栏林德熙的博客

C# 使用反射获取私有属性的方法 测试

本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多

15620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励