当前位置: 首页 > news >正文

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 社交登录

依赖过滤器OAuth2AuthorizationRequestRedirectFilterOAuth2LoginAuthenticationFilter
配置

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 过滤器前后端分离架构
安全防护CsrfFilterCorsFilter防止 CSRF、配置跨域
细粒度授权FilterSecurityInterceptor基于 URL 或方法的权限控制
会话管理SessionManagementFilter控制会话创建策略和并发登录
静态资源WebSecurity.ignoring()加速 CSS/JS/图片加载

通过灵活组合这些配置,开发者可以快速实现从简单登录到复杂分布式系统的安全需求,同时保持代码的可维护性和扩展性。

相关文章:

  • 周末总结(2024/04/05)
  • 前端 vs 后端:技术分工详解——从用户界面到系统逻辑的全解析
  • MyBatis八股文-执行流程、延迟加载、一级与二级缓存
  • 判断HiveQL语句为建表语句的识别函数
  • 在Spring Boot中配置数据库连接
  • 一个使用nginx转发的cgi程序示例
  • BEVFormer v2(CVPR2023)
  • Airflow量化入门系列:第一章 Airflow 基础与量化交易场景
  • K8S学习之基础七十二:Ingress基于Https代理pod
  • 【LLM】MCP(Python):实现 SSE 通信的 Server 和 Client
  • NO.66十六届蓝桥杯备战|基础算法-贪心-区间问题|凌乱的yyy|Rader Installation|Sunscreen|牛栏预定(C++)
  • 一键自动备份:数据安全的双重保障
  • Linux网络:数据链路层以太网
  • 6.第二阶段x64游戏实战-分析人物状态
  • MySQL:表的约束
  • Windows 10/11系统优化工具
  • 基于Spark的招聘数据预测分析推荐系统
  • Golang的Web框架比较与选择
  • 26.[MRCTF2020]Transform 1
  • 构建macOS命令速查手册:基于Flask的轻量级Web应用实践