spring security 过滤器链使用
Spring Security 的过滤器链提供了灵活的安全控制机制,以下是其在实际开发中的 常见用法 及对应的过滤器配置示例:
一、认证方式配置
1. 表单登录认证
• 过滤器:UsernamePasswordAuthenticationFilter
• 配置:
http.formLogin()
.loginPage("/login") // 自定义登录页
.loginProcessingUrl("/auth") // 登录处理路径
.defaultSuccessUrl("/home") // 登录成功跳转
.failureUrl("/login?error"); // 登录失败跳转
2. JWT 令牌认证
• 自定义过滤器:解析请求头中的 JWT Token
public class JwtAuthFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
String token = request.getHeader("Authorization");
if (validateToken(token)) {
Authentication auth = createAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
}
}
• 注册过滤器:
http.addFilterBefore(new JwtAuthFilter(), UsernamePasswordAuthenticationFilter.class);
3. OAuth2 社交登录
• 依赖过滤器:OAuth2AuthorizationRequestRedirectFilter
、OAuth2LoginAuthenticationFilter
• 配置:
http.oauth2Login()
.loginPage("/login")
.defaultSuccessUrl("/profile")
.userInfoEndpoint().userService(oauth2UserService);
二、安全防护配置
1. 禁用 CSRF 防护
• 适用场景:无状态 API 服务(如使用 JWT)
http.csrf().disable();
2. 启用 CORS 跨域支持
• 过滤器:CorsFilter
• 配置:
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("https://example.com");
config.addAllowedMethod("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
3. 安全响应头配置
• 过滤器:HeaderWriterFilter
• 配置:
http.headers()
.contentSecurityPolicy("default-src 'self'")
.frameOptions().deny();
三、授权控制配置
1. 基于角色的访问控制
• 过滤器:FilterSecurityInterceptor
• 配置:
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated();
2. 方法级权限控制
• 启用注解:
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {}
• 使用注解:
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin/dashboard")
public String adminDashboard() { /* ... */ }
四、会话管理
1. 无状态会话(适用于 API)
• 配置:
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
2. 会话并发控制
• 配置:
http.sessionManagement()
.maximumSessions(1) // 每个用户最多一个会话
.expiredUrl("/login?expired");
五、静态资源处理
1. 忽略静态资源
• 过滤器:WebSecurity
配置
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/css/**", "/js/**", "/images/**");
}
六、异常处理
1. 自定义未认证响应
• 配置:
http.exceptionHandling()
.authenticationEntryPoint((request, response, authException) -> {
response.sendError(HttpStatus.UNAUTHORIZED.value(), "请先登录");
});
2. 自定义无权限响应
• 配置:
http.exceptionHandling()
.accessDeniedHandler((request, response, accessDeniedException) -> {
response.sendError(HttpStatus.FORBIDDEN.value(), "权限不足");
});
七、自定义过滤器链
1. 添加自定义过滤器
// 添加日志过滤器到链首
http.addFilterBefore(new RequestLoggingFilter(), SecurityContextPersistenceFilter.class);
2. 移除默认过滤器
// 禁用默认的 BasicAuthenticationFilter
http.httpBasic().disable();
总结
Spring Security 过滤器链的常见用法可归纳为以下场景:
场景 | 关键过滤器/配置 | 典型应用 |
---|---|---|
表单登录 | UsernamePasswordAuthenticationFilter | 传统 Web 应用登录 |
API 令牌认证 | 自定义 JWT/OAuth2 过滤器 | 前后端分离架构 |
安全防护 | CsrfFilter 、CorsFilter | 防止 CSRF、配置跨域 |
细粒度授权 | FilterSecurityInterceptor | 基于 URL 或方法的权限控制 |
会话管理 | SessionManagementFilter | 控制会话创建策略和并发登录 |
静态资源 | WebSecurity.ignoring() | 加速 CSS/JS/图片加载 |
通过灵活组合这些配置,开发者可以快速实现从简单登录到复杂分布式系统的安全需求,同时保持代码的可维护性和扩展性。