知識庫 / Spring / Spring Security RSS 訂閱

Spring Security – 配置不同 URL 的策略

Spring Security
HongKong
5
12:18 PM · Dec 06 ,2025

1. 概述

在本教程中,我們將探討如何配置 Spring Security 以針對不同的 URL 模式使用不同的安全配置。

當應用程序需要針對某些操作實施更嚴格的安全措施,而其他操作則允許所有用户執行時,這種方法非常有用。

2. 部署準備

讓我們首先設置應用程序。

我們需要 WebSecurity 依賴項來創建此服務。 讓我們首先將以下依賴項添加到 <code >pom.xml</code> 文件中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-security</artifactId> 
</dependency> 

3. 創建 API

我們將創建一個 RESTful Web 服務,包含兩個 API:一個產品 API 和一個客户 API。為了實現這一目標,我們將設置兩個控制器。

3.1. 產品 API

讓我們創建 ProductController。它包含一個單一的方法,getProducts,該方法返回一個產品列表:

@RestController("/products")
public class ProductController {
    
    @GetMapping
    public List<Product> getProducts() {
        return new ArrayList<>(Arrays.asList(
          new Product("Product 1", "Description 1", 1.0),
          new Product("Product 2", "Description 2", 2.0)
        ));
    }
}

3.2. 客户 API

同樣,我們來定義 CustomerController:

@RestController("/customers")
public class CustomerController {
    
    @GetMapping("/{id}")
    public Customer getCustomerById(@PathVariable("id") String id) {
        return new Customer("Customer 1", "Address 1", "Phone 1");
    }
}

在典型的 Web 應用程序中,包括訪客用户,所有用户都可以獲取產品列表。

但是,通過用户 ID 獲取客户詳情似乎只允許管理員執行的操作。因此,我們將定義安全配置,以支持此功能。

4. 設置安全配置

當我們將 Spring Security 添加到項目中時,它將默認禁用所有 API 的訪問。因此,我們需要配置 Spring Security 以允許訪問這些 API。

讓我們創建一個名為 SecurityConfiguration 的類:

@Configuration
public class SecurityConfiguration {

     @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http.authorizeHttpRequests(request -> request.requestMatchers(new AntPathRequestMatcher("/products/**"))
                .permitAll())
            .authorizeHttpRequests(request -> request.requestMatchers(new AntPathRequestMatcher("/customers/**"))
                .hasRole("ADMIN")
                .anyRequest()
                .authenticated())
            .httpBasic(Customizer.withDefaults())
            .build();
    }
}

在這裏,我們創建了一個 SecurityFilterChain Bean,用於配置應用程序的安全性。

此外,為了進行基本的身份驗證準備,我們需要配置應用程序的用户。

我們將閲讀每一部分代碼以更好地理解它。

4.1. 允許對產品 API 的請求

  1. authorizeRequests(): 此方法告訴 Spring 在授權請求時使用以下規則。
  2. antMatchers(“/products/**”): 這指定了安全配置適用的 URL 模式。我們將其與 permitAll() 操作進行鏈接。如果請求路徑包含 “/products” ,則允許該請求到達控制器。
  3. 我們可以使用 and() 方法添加更多規則到我們的配置中。

這標誌着規則鏈的一個結束。後續的規則也將應用於請求。因此,我們需要確保我們的規則不相互衝突。一個好的做法是在頂部定義通用的規則,在底部定義更具體的規則。

4.2. 僅允許管理訪問客户 API

現在我們來看配置的第二部分:

  • 為了啓動新的規則,我們可以再次使用 authorizeRequests() 方法。
  • antMatchers(“/customers/**”).hasRole(“ADMIN”): 如果 URL 包含路徑中“/customers”,則檢查請求發起者是否具有 ADMIN 角色。

如果用户未經過身份驗證,將會導致 “401 Unauthorized” 錯誤。如果用户沒有正確的角色,將會導致 “403 Forbidden” 錯誤。

4.3. 默認規則

我們已添加匹配項以匹配某些請求。現在我們需要為其餘請求定義一些默認行為。

anyRequest().authenticated()anyRequest() 定義了一個用於任何未匹配先前規則的請求的規則鏈。 在我們的情況下,只要請求已認證,這些請求將被傳遞。

請注意,配置中只能有一個默認規則,並且它必須位於末尾。 如果我們嘗試在添加默認規則後添加規則,則會收到錯誤——“Can’t configure antMatchers after anyRequest”。

5. 測試

讓我們使用 cURL 測試兩個 API。

5.1. 測試產品 API

測試產品 API 是確保產品與外部系統之間的集成工作正常進行的關鍵步驟。 這包括驗證 API 端點是否返回預期的響應,以及驗證數據是否正確傳輸。

以下是測試產品 API 的一些關鍵方面:

  • 端點驗證: 驗證所有 API 端點是否正常工作。
  • 響應驗證: 驗證 API 響應是否包含預期的數據格式和內容。
  • 數據驗證: 驗證 API 傳輸的數據是否正確,包括數據類型、值範圍和格式。
  • 錯誤處理: 驗證 API 是否正確處理錯誤情況,並返回有意義的錯誤消息。
  • 性能測試: 評估 API 的響應時間、吞吐量和資源利用率。

以下是一個示例代碼塊,展示瞭如何使用 Python 和 requests 庫測試 API:

import requests

url = "https://api.example.com/products"
response = requests.get(url)

if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print("Error:", response.status_code)

在上面的代碼中,requests.get(url) 方法用於向 API 端點發送 GET 請求。 response.status_code 屬性包含 HTTP 狀態碼,指示請求是否成功。 response.json() 方法將響應內容解析為 JSON 對象。

$ curl -i http://localhost:8080/products
[
  {
    "name": "Product 1",
    "description": "Description 1",
    "price": 1.0
  },
  {
    "name": "Product 2",
    "description": "Description 2",
    "price": 2.0
  }
]

我們成功獲取了兩個產品響應,符合預期。

5.2. 測試客户 API

在完成客户 API 的開發後,必須對其進行徹底的測試,以確保其功能正常、性能良好,並且符合所有要求。測試應包括但不限於以下方面:

  • 單元測試 (Unit Testing): 對 API 的每個組件進行獨立測試,驗證其功能是否符合預期。
  • 集成測試 (Integration Testing): 測試 API 與其他系統或組件的交互,確保數據正確傳遞和處理。
  • 端到端測試 (End-to-End Testing): 模擬真實用户場景,測試整個 API 流程,驗證最終結果。
  • 性能測試 (Performance Testing): 評估 API 在不同負載下的響應時間和吞吐量,確保其能夠滿足業務需求。
  • 安全測試 (Security Testing): 識別和修復 API 中的安全漏洞,例如 SQL 注入、跨站腳本攻擊等。

在測試過程中,應使用各種測試工具和技術,例如:

  • Postman: 用於發送 HTTP 請求和驗證響應。
  • JMeter: 用於進行負載測試和性能測試。
  • Selenium: 用於進行自動化測試。

測試結果應記錄在測試報告中,並用於跟蹤和解決問題。

$ curl -i http://localhost:8080/customers/1

響應體為空。

如果檢查請求頭,我們會看到“401 Unauthorized”狀態碼。這是因為訪問 Customer API 僅允許經過身份驗證且具有 ADMIN 角色的用户。

現在,在請求中添加身份驗證信息後,我們再次嘗試。

$ curl -u admin:password -i http://localhost:8080/customers/1 
{
  "name": "Customer 1",
  "address": "Address 1",
  "phone": "Phone 1"
}

太棒了!我們現在可以訪問客户 API。

6. 結論

在本教程中,我們學習瞭如何在 Spring Boot 應用程序中設置 Spring Security。我們還介紹瞭如何使用 <em >antMatchers()</em> 方法配置特定 URL 模式的訪問權限。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.