Loading... ### Spring Security 学习之过滤 Web 请求 Spring Security 是一个功能强大的安全框架,提供了全面的 Web 安全功能。它的核心之一是过滤器链,用于拦截和处理 Web 请求。本文将详细介绍如何在 Spring Security 中配置和使用过滤器来管理 Web 请求的安全性。 ![](https://www.8kiz.cn/usr/uploads/2024/07/2168569712.png) #### 一、Spring Security 过滤器链 Spring Security 使用过滤器链来处理所有进入应用程序的 HTTP 请求。这些过滤器按顺序执行,每个过滤器负责特定的安全功能,如身份验证、授权、会话管理、跨站点请求伪造(CSRF)保护等。 1. **核心过滤器**: - `SecurityContextPersistenceFilter`:从存储中加载 `SecurityContext` 到 `SecurityContextHolder`。 - `UsernamePasswordAuthenticationFilter`:处理基于表单登录的身份验证。 - `BasicAuthenticationFilter`:处理 HTTP Basic 验证。 - `ExceptionTranslationFilter`:处理安全异常,如访问被拒绝和身份验证失败。 - `FilterSecurityInterceptor`:执行访问决策。 #### 二、配置 Spring Security 过滤器链 要配置 Spring Security 的过滤器链,可以通过扩展 `WebSecurityConfigurerAdapter` 类并重写 `configure` 方法来实现。以下是一个示例配置: ```java import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() // 禁用 CSRF 保护 .authorizeRequests() .antMatchers("/public/**").permitAll() // 允许所有用户访问 /public 路径 .antMatchers("/admin/**").hasRole("ADMIN") // 仅允许具有 ADMIN 角色的用户访问 /admin 路径 .anyRequest().authenticated() // 其他请求需要认证 .and() .formLogin() .loginPage("/login") // 自定义登录页面 .permitAll() .and() .logout() .permitAll(); } } ``` #### 三、常见的过滤器配置 1. **身份验证**: - 通过 `UsernamePasswordAuthenticationFilter` 实现表单登录身份验证。 - 通过 `BasicAuthenticationFilter` 实现 HTTP Basic 验证。 2. **授权**: - 通过 `FilterSecurityInterceptor` 配置 URL 级别的访问控制。 - 使用 `@PreAuthorize` 和 `@Secured` 注解进行方法级别的访问控制。 3. **会话管理**: - 通过 `SessionManagementFilter` 管理会话策略,如会话并发控制和会话固定攻击防护。 4. **跨站点请求伪造(CSRF)保护**: - 默认情况下启用,通过 `CsrfFilter` 实现。可以通过 `http.csrf().disable()` 禁用 CSRF 保护。 #### 四、示例代码解析 下面是一个完整的示例,展示了如何配置 Spring Security 来管理 Web 请求的安全性: **配置类**: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/", "/home").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("USER", "ADMIN") .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` **说明**: - `authorizeRequests`:配置 URL 级别的访问控制。`/home` 和 `/` 路径允许所有用户访问,`/admin/**` 路径仅允许 ADMIN 角色访问,其他路径需要认证。 - `formLogin`:配置基于表单的登录,指定自定义登录页面。 - `logout`:配置登出功能,允许所有用户访问。 - `configure(AuthenticationManagerBuilder auth)`:配置内存中的用户存储,定义两个用户:user 和 admin。 ### 思维导图 ```mermaid graph TD; A[Spring Security 过滤 Web 请求] --> B[核心过滤器] A --> C[配置过滤器链] A --> D[常见过滤器配置] A --> E[示例代码解析] B --> B1[SecurityContextPersistenceFilter] B --> B2[UsernamePasswordAuthenticationFilter] B --> B3[BasicAuthenticationFilter] B --> B4[ExceptionTranslationFilter] B --> B5[FilterSecurityInterceptor] C --> C1[身份验证] C --> C2[授权] C --> C3[会话管理] C --> C4[CSRF 保护] D --> D1[身份验证配置] D --> D2[授权配置] D --> D3[会话管理配置] D --> D4[CSRF 保护配置] E --> E1[配置类] E --> E2[说明] ``` ### 总结 通过配置 Spring Security 的过滤器链,开发者可以灵活地管理 Web 请求的安全性。理解核心过滤器的作用以及如何配置和组合这些过滤器,可以帮助开发者实现复杂的安全需求。通过具体的示例代码,可以清晰地了解 Spring Security 的配置方法和实践。 最后修改:2024 年 07 月 25 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏