1. 程式人生 > 程式設計 >原來SpringSecurity整合OAuth2後開放許可權攔截路徑還能這麼玩?

原來SpringSecurity整合OAuth2後開放許可權攔截路徑還能這麼玩?

當我們整合了Spring Security以及OAuth2後發現,有一些業務請求是需要開放的,因為種種原因這時訪問者還沒有身份標識(比如:使用者剛來,還沒有註冊,需要進行新使用者註冊,這時註冊業務相關的介面都應該是開放的),下面我們來看看ApiBoot是怎麼排除路徑不進行許可權攔截的。

官方相關檔案

相關ApiBoot Security官方使用檔案,請訪問 ApiBoot Security

在檔案的第4. 預設排除路徑部分,我們瞭解到了ApiBoot Security為了與其他的第三方框架進行整合,在內部已經添加了一些預設的攔截路徑,當我們在新增開放路徑時會在預設的基礎上增量新增,不會覆蓋

部落格原文地址:blog.yuqiyu.com/apiboot-sec…

建立專案

我們使用IDEA開發工具建立一個SpringBoot專案,在pom.xml內新增相關的依賴,如下所示:

<dependencies>
  <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>
<dependencyManagement>
  <dependencies>
    <!--ApiBoot統一版本依賴-->
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>複製程式碼

排除路徑配置

ApiBoot Security OAuth安全元件預設攔截配置為/api/**,也就是/api下的全部路徑以及子路徑都需要認證後才可以訪問。

我們可以通過api.boot.security.auth-prefix引數配置修改保護的路徑列表ApiBoot還提供了另外的一個引數配置api.boot.security.ignoring-urls,用於配置開放的路徑列表(開放路徑可直接訪問,不走許可權攔截),支援使用Ant風格,application.yml配置內容如下所示:

spring:
  application:
    name: apiboot-security-open-paths-without-intercept
server:
  port: 9090

api:
  boot:
    # ApiBoot Security安全配置
    security:
      # 許可權攔截的路徑字首
      auth-prefix: /**
      # 排除不攔截的路徑
      ignoring-urls:
        - /index/**複製程式碼

我們在application.yml檔案內配置api.boot.security.ignoring-urls的值為/index/**,這時我們在訪問/index/index/xxx路徑時都不會經過許可權的攔截,直接可以訪問到。

示例請求

我們來建立一個名為IndexController的示例控制器,來驗證我們開放的路徑是否已經生效了,如下所示:


/**
 * 示例:控制器
 *
 * @author 恆宇少年
 */
@RestController
@RequestMapping(value = "/index")
public class IndexController {
    /**
     * 示例:首頁地址
     * /index
     *
     * @return
     */
    @GetMapping
    public String index() {
        return "this is index page.";
    }

    /**
     * 示例:首頁地址子頁面
     * /index/sub
     *
     * @return
     */
    @GetMapping(value = "/sub")
    public String indexSub() {
        return "this is sub index page.";
    }
}複製程式碼

application.yml我們配置的開放地址為/index/**,所以IndexController控制器內的兩個地址/index/index/sub都會被開放,不走許可權攔截,直接放行。

執行測試

我們使用IDEA通過XxxApplication入口類的方式來啟動本章專案原始碼,下面是我們要驗證的測試點。

測試點:開放路徑

我們先來訪問下http://localhost:9090/index,效果如下所示:

➜ ~ curl http://localhost:9090/index    
this is index page.複製程式碼

直接訪問/index是可以直接獲取介面返回的內容,這也證明瞭一點,這個地址被開放了,不再被許可權攔截。

在之前說到ApiBoot Security OAuth開放地址支援Ant風格,我們配置的開放地址為/index/**,所以/index/sub這個請求地址也應該已經被開放了,效果如下所示:

➜ ~ curl http://localhost:9090/index/sub
this is sub index page.複製程式碼

如果我們修改api.boot.security.ignoring-urls配置為/index,我們在訪問/index/sub這個地址時是沒有許可權的,需要攜帶有效的AccessToken才可以訪問到。

測試點:未開放路徑的攔截

下面我們來完成一個比較特殊的測試點,訪問一個並沒有在後臺定義的路徑,如下所示:

➜ ~ curl http://localhost:9090/index/11
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}複製程式碼

我們並沒有新增/index/xx這個請求地址的實現,當訪問時同樣也會被攔截,這證明瞭我們發起的請求並沒有到達解析請求就已經被許可權攔截了。

敲黑板,劃重點

除了被開放的路徑都需要提供有效的AccessToken才可以訪問,無論這個地址是否存在,本章為了示例講解方便我這裡配置的許可權攔截根地址為/**api.boot.security.auth-paths引數原始碼是一個陣列(詳見:org.minbox.framework.api.boot.autoconfigure.security.ApiBootSecurityProperties),可以配置多個地址,比如:/user/**/order/**api.boot.security.ignoring-urls同樣支援陣列形式配置多個。

免費教程專題

恆宇少年在部落格整理三套免費學習教程專題,由於文章偏多特意添加了閱讀指南,新文章以及之前的文章都會在專題內陸續填充,希望可以幫助大家解惑更多知識點。

程式碼示例

如果您喜歡本篇文章請為原始碼倉庫點個Star,謝謝!!!本篇文章示例原始碼可以通過以下途徑獲取,目錄為apiboot-security-open-paths-without-intercept

作者個人 部落格

使用開源框架 ApiBoot 助你成為Api介面服務架構師