1. 概述
在本教程中,我們將探討如何配置 Spring Security 以針對不同的 URL 模式使用不同的安全配置。
當應用程序需要針對某些操作實施更嚴格的安全措施,而其他操作則允許所有用户執行時,這種方法非常有用。
2. 部署準備
讓我們首先設置應用程序。
我們需要 Web 和 Security 依賴項來創建此服務。 讓我們首先將以下依賴項添加到 <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 的請求
- authorizeRequests(): 此方法告訴 Spring 在授權請求時使用以下規則。
- antMatchers(“/products/**”): 這指定了安全配置適用的 URL 模式。我們將其與 permitAll() 操作進行鏈接。如果請求路徑包含 “/products” ,則允許該請求到達控制器。
- 我們可以使用 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 模式的訪問權限。