1. 概述
在本教程中,我們將學習如何配置 Spring Security 以允許在 Spring Boot 3 應用程序中訪問 Swagger UI。
Swagger UI 是一種用於記錄 API 的工具。它提供了一個用户友好的界面,用於與 API 交互和測試端點。但是,當我們啓用 Spring Security 在應用程序中時,由於安全限制,Swagger UI 變得不可訪問。
我們將探索如何在 Spring Boot 3 應用程序中設置 Swagger,並配置 Spring Security 以允許訪問 Swagger UI。
2. 代碼設置
讓我們首先設置我們的應用程序。我們將添加必要的依賴項並創建一個簡單的控制器。我們將配置 Swagger 並驗證 Swagger UI 是否可訪問。然後,我們將通過配置 Spring Security 來修復它。
2.1. 添加 Swagger 和 Spring Security 依賴
首先,我們將必要的依賴項添加到 pom.xml 文件中:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
The 當我們添加此依賴項時,Spring Security 默認啓用並阻止所有 URL 的訪問。
The @RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
當我們調用 hello 端點時,它返回字符串 “Hello, World!”。 接下來,我們配置 Swagger。我們將設置配置以啓用 Swagger,並向控制器添加註釋。 為了配置 Swagger,我們需要創建一個配置類: 在這裏,我們創建了一個名為 SwaggerConfig 的類,並定義了一個 publicApi() 方法,該方法返回一個 GroupedOpenApi Bean。這個 Bean 將所有匹配指定路徑模式的端點分組在一起。 我們定義了方法中的一個組 public,並指定了路徑模式為 “/**” 。這意味着應用程序中的所有端點都將被包含在這個組中。 接下來,讓我們為控制器添加 Swagger 註解: 我們為 @Operation 註解添加到 @hello 方法中,用於描述該端點。該描述將在 Swagger UI 中顯示。 現在,讓我們運行應用程序並測試 Swagger UI。 默認情況下,Swagger UI 可在以下地址訪問:http://localhost:8080/swagger-ui/index.html。 如上所示,我們發現 Swagger UI 無法訪問。 相反,我們會被提示輸入用户名和密碼。 Spring Security 需要在允許訪問 URL 之前對用户進行身份驗證。 現在,讓我們配置 Spring Security 以允許訪問 Swagger UI。我們將探討兩種實現這一目標的方法:使用 通過使用 WebSecurityCustomizer 接口,可以輕鬆地排除 Spring Security 上的路徑。我們可以使用此接口在指定的 URL 上禁用 Spring Security。 讓我們在配置類中定義一個類型為 WebSecurityCustomizer 的 Bean: 該<em>@Configuration</em>註解標記了該類為一個配置類。接下來,我們定義一個類型為<em>WebSecurityCustomizer</em>的Bean。 這裏,我們使用了一個 lambda 表達式來定義一個<em>WebSecurityCustomizer</em>的實現。<strong>我們使用了<em>ignoring()</em>方法來排除 Swagger UI URL 路徑<em>/swagger-ui/**</em>和<em>/v3/api-docs/**</em>從安全配置中。</strong> 這在我們需要忽略 URL 上的所有安全規則時非常有用。<strong>僅當該 URL 是內部且未公開訪問時才建議使用,因為在這種情況下不會應用任何安全規則。</strong> 另一種覆蓋 Spring Security 默認實現的辦法是定義一個 SecurityFilterChain Bean。 這樣,我們就可以在我們的實現中允許 Swagger URL。 為此,我們可以定義一個 SecurityFilterChain Bean: 此方法配置安全過濾器鏈,允許訪問 Swagger UI URL: 這是允許對某些 URL 模式進行未身份驗證請求的推薦方法。 這些 URL 將包含 Spring Security 響應頭,但不需要用户身份驗證。 現在,讓我們運行應用程序並再次測試 Swagger UI。 Swagger UI 現在應該可以訪問。 在本文中,我們學習瞭如何配置 Spring Security 以允許在 Spring Boot 3 應用程序中訪問 Swagger UI。我們探討了如何使用 SecurityFilterChain 接口和 WebSecurityCustomizer 接口從 Spring Security 配置中排除 Swagger UI URL。3. 配置 Swagger
3.1. 配置類
@Configuration
public class SwaggerConfig {
@Bean
public GroupedOpenApi publicApi() {
return GroupedOpenApi.builder()
.group("public")
.pathsToMatch("/**")
.build();
}
}
3.2. Swagger 註解
@Operation(summary = "Returns a Hello World message")
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
} 3.3. 測試
4. 配置 Spring Security 以允許 Swagger UI 訪問
<em >SecurityFilterChain</em> 和 <em >WebSecurityCustomizer</em>。4.1. 使用 WebSecurityCustomizer
@Configuration
public class SecurityConfig {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring()
.requestMatchers("/swagger-ui/**", "/v3/api-docs*/**");
}
}4.2. 使用 SecurityFilterChain
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(
authorizeRequests -> authorizeRequests.requestMatchers("/swagger-ui/**")
.permitAll()
.requestMatchers("/v3/api-docs*/**")
.permitAll());
return http.build();
}
4.3. 測試
如圖所示,頁面已可訪問,幷包含有關我們的控制器端點的信息。
5. 結論