ApiBoot - ApiBoot Security Oauth 依賴使用文檔

ApiBoot是一款基於SpringBoot1.x,2.x的接口服務集成基礎框架, 內部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發者能夠選着性完成開箱即用, 再也不爲搭建接口框架而犯愁,從而極大的提升開發效率。html

引入 ApiBoot Security Oauth

pom.xml配置文件內添加以下:java

<!--ApiBoot Security Oauth-->
<dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
</dependency>
ApiBoot所提供的依賴都不須要添加版本號,可是須要添加版本依賴,具體查看 ApiBoot版本依賴

配置參數列表

ApiBoot在整合SpringSecurityOauth2時把配置參數進行了分離,配置列表以下所示:mysql

整合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
/swagger-ui.html
/swagger-resources/configuration/security
/META-INF/resources/webjars/
/swagger-resources
/swagger-resources/configuration/ui
/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存放到數據庫,固然反過來也是能夠的,相互不影響!!!git

內存方式(默認方式)

Spring Security

ApiBoot在整合Spring Security的內存方式時,僅僅須要配置api.boot.security.users用戶列表參數便可,就是這麼的簡單,github

配置用戶示例以下所示:web

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

api.boot.security.users是一個List<SecurityUser>類型的集合,因此這裏能夠配置多個用戶。sql

Oauth2

若是所有使用默認值的狀況話不須要作任何配置!!!數據庫

Jdbc方式

前提:項目須要添加數據源依賴。

Spring Security

默認用戶表api

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簽名建議進行更換。

本章源碼地址:https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-security-oauth-jwt

ApiBoot 開源交流羣

相關文章
相關標籤/搜索