禁用 Spring Security 的指南
1. 概述
Spring Security 是一個功能強大、高度可自訂的 Java 應用程式身份驗證和存取控制框架。我們將概述 Spring Security 的用途以及一些可能需要停用它的常見場景,例如在開發、測試期間或使用自訂安全機制時。
本文將引導我們完成在 Spring Boot 應用程式中停用 Spring Security 的步驟,同時確保配置易於管理和恢復。我們還將在這裡提供可以在我們的專案中參考的程式碼範例,並附上單元測試來演示其行為。在本教程中,我們將討論瞭解如何在 Spring Boot 應用程式中停用 Spring Security 所需的基本概念。
2.禁用Spring Security
根據我們應用程式的具體要求,我們可以透過多種方式停用 Spring Security。我們將探討四種常見方法:
- 使用自訂安全性配置
- 利用 Spring 設定檔
- 刪除 Spring Security 依賴
- 不包括 Spring Security 自動配置
在討論禁用 Spring Security 的不同策略之前,讓我們透過Spring Initializr設定一個簡單的 Spring Boot 應用程序,我們將在整個指南中使用它。我們將建立一個基於 Maven 的最小 Spring Boot 項目,該項目包含一個控制器,作為我們的測試端點:
@RestController
@RequestMapping("/api")
public class PublicController {
@GetMapping("/endpoint")
public ResponseEntity<String> publicEndpoint() {
return ResponseEntity.ok("This is a public endpoint.");
}
}
3. 使用自訂安全性配置
停用 Spring Security 最直接的方法之一是建立自訂安全配置類別。此方法涉及定義**和配置****SecurityFilterChain**
bean**以允許所有無需身份驗證的請求:**
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
.csrf(AbstractHttpConfigurer::disable);
return http.build();
}
4. 利用 Spring Profiles
Spring 設定檔允許我們為應用程式配置不同的環境。我們可以使用設定檔來停用某些環境中的安全性,例如開發或測試。建立一個新的特定於設定檔的屬性文件,例如application-dev.properties
,並新增以下行:
server.port= 8080
spring.profiles.active=dev
spring.application.name=spring-security-noauth-profile
現在,建立名為DevSecurityConfiguration
的新 Java 類別。此類別專為 Spring Boot 應用程式中的「 dev
」設定檔配置。它透過允許所有請求來實現對所有端點的不受限制的存取。這在開發階段很有用,可以簡化測試和調試而不受安全限制:
@Profile("dev")
public class DevSecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
return http.build();
}
}
除了上述配置之外,我們還將定義另一個在dev
設定檔未啟動時適用的**安全性設定類別。此配置啟用身份驗證並允許對所有端點進行受限存取**:
@Profile("!dev")
public class SecurityConfiguration {
@Bean
SecurityFilterChain httpSecurity(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.formLogin(withDefaults())
.httpBasic(withDefaults());
return http.build();
}
}
當我們使用dev
設定檔在開發環境中運行應用程式時,所有請求都將被允許而無需身份驗證。但是,當應用程式使用除dev
之外的任何設定檔運行時,我們的應用程式都需要對任何類型的請求進行身份驗證。
5.刪除Spring Security依賴項
停用 Spring Security 最簡單的方法是從專案中刪除其相依性。透過這樣做,我們將刪除 Spring Security 提供的所有與安全相關的配置和預設值:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>...</version>
</dependency>
刪除此依賴項將會從應用程式中刪除所有 Spring Security 功能。
6. 排除 Spring Security 自動配置
當我們在類別路徑中包含spring-boot-starter-security
時,Spring Boot 會自動配置安全性。若要停用它,請透過向 application.properties 添加以下屬性來排除自動配置:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
如果我們想完全停用 Spring Security,我們應該使用spring.autoconfigure.exclude
,而不是建立SecurityConfiguration
類別。手動配置 Spring Security 類別會覆蓋 application.properties 配置,因此當兩者一起使用時,application.properties 中的排除不起作用。
7. 沒有安全性的測試
我們可以透過啟動應用程式並本地存取端點來驗證我們是否已停用安全性。啟動並執行 Spring Boot 應用程序,當我們嘗試存取 REST 端點時,我們將看到以下回應:
我們可以透過使用MockMvc
庫編寫 JUnit 測試來以程式方式驗證安全性是否已停用。
7.1.自訂安全配置的單元測試
以下是一個範例單元測試,用於驗證安全性配置是否允許不受限制的存取:
public class CommonSecurityConfigTest {
@Autowired
private MockMvc mockMvc;
@Test
public void whenSecurityIsDisabled_thenAllEndpointsAreAccessible() throws Exception {
mockMvc.perform(get("/api/endpoint"))
.andExpect(status().isOk());
}
}
7.2.應用程式設定檔的單元測試
我們編寫了兩個單獨的測試來驗證我們的安全性是否會根據活動設定檔而表現出不同的行為。這是禁用安全性時對dev
檔的單元測試:
@ActiveProfiles("dev")
public class DevProfileSecurityConfigTest {
@Autowired
private MockMvc mockMvc;
@Test
public void whenDevProfileIsActive_thenAccessIsAllowed() throws Exception {
mockMvc.perform(get("/api/endpoint"))
.andExpect(status().isOk());
}
}
以下是啟用安全性時non
dev
檔的單元測試:
public class NonDevProfileSecurityConfigTest {
@Autowired
private MockMvc mockMvc;
@Test
public void whenNonDevProfileIsActive_thenAccessIsDenied() throws Exception {
mockMvc.perform(get("/api/endpoint"))
.andExpect(status().isUnauthorized());
}
}
8. 結論
在本文中,我們討論了在 Spring Boot 應用程式中停用 Spring Security 的各種方法,每種方法適用於不同的場景。無論我們使用自訂安全配置還是利用 Spring 設定文件,該方法都應該符合我們的開發和部署需求。透過遵循本文概述的步驟,我們可以確保我們的應用程式保持靈活且易於管理,尤其是在開發和測試階段。
請務必記住在生產環境中重新啟用安全性,以維護我們應用程式的完整性和安全性。與往常一樣,這些範例的程式碼可以在 GitHub 上找到。