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
中的过滤器将按顺序执行,每个过滤器都会根据其职责对请求进行处理。 - 如果请求在某个过滤器中被认为是合法的,则它将继续传递到下一个过滤器,直到达到最终的目的地(如控制器)。
- 如果请求在某个过滤器中被拦截(如认证失败),则过滤器会返回一个响应,并且请求将不再继续传递。