1. 配置SecurityFilterChain
在Spring Boot應用程序中,通常通過配置類來定義SecurityFilterChain
。Spring Boot 2.x及更高版本與Spring Security 5.x緊密集成,提供了簡化的配置方式。以下是一個基于Java配置的例子:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain; @Configuration
@EnableWebSecurity
public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http // 配置哪些請求需要認證 .authorizeRequests() .antMatchers("/public/**").permitAll() // 公開路徑不需要認證 .anyRequest().authenticated() // 其他路徑都需要認證 .and() // 配置表單登錄 .formLogin() .loginPage("/login") // 自定義登錄頁面 .loginProcessingUrl("/perform_login") // 自定義登錄處理URL .defaultSuccessUrl("/home", true) // 登錄成功后跳轉到的頁面 .and() // 配置注銷 .logout() .logoutUrl("/logout") // 注銷URL .logoutSuccessUrl("/login?logout") // 注銷成功后跳轉到的頁面 .and() // 其他安全配置... ; // 返回一個配置好的SecurityFilterChain實例 return http.build(); }
}
2.SecurityFilterChain的工作原理
- 當一個HTTP請求到達Spring應用程序時,
FilterChainProxy
(Spring Security的一個組件)會攔截該請求。 FilterChainProxy
會根據請求的路徑和配置的SecurityFilterChain
來決定將請求轉發給哪個SecurityFilterChain
實例。- 選定的
SecurityFilterChain
中的過濾器將按順序執行,每個過濾器都會根據其職責對請求進行處理。 - 如果請求在某個過濾器中被認為是合法的,則它將繼續傳遞到下一個過濾器,直到達到最終的目的地(如控制器)。
- 如果請求在某個過濾器中被攔截(如認證失敗),則過濾器會返回一個響應,并且請求將不再繼續傳遞。