spring security的过滤器链

打印 上一主题 下一主题

主题 1554|帖子 1554|积分 4664

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Spring Security 的安全功能通过一系列过滤器(Filter)构成的链式结构实现,每个过滤器负责处理特定的安全任务。这些过滤器按特定顺序实行,形成过滤器链(Security Filter Chain)。以下是其核心过滤器及工作原理的详细剖析:

一、默认过滤器链(按实行顺序)

过滤器名称(类名)作用1. SecurityContextPersistenceFilter从 Session 加载或创建 SecurityContext(存储认证信息)。2. HeaderWriterFilter写入安全相干的 HTTP 头(如 X-Content-Type-Options、X-Frame-Options)。3. CsrfFilter检查 CSRF Token(防止跨站请求伪造)。默认掩护非 GET、HEAD、TRACE、OPTIONS 请求。4. LogoutFilter处理注销请求(默认路径 /logout),扫除安全上下文和 Session。5. UsernamePasswordAuthenticationFilter处理表单登录(默认路径 /login),提取用户名密码并认证。6. DefaultLoginPageGeneratingFilter天生默认登录页(当未配置自定义登录页时生效)。7. DefaultLogoutPageGeneratingFilter天生默认注销页。8. BasicAuthenticationFilter处理 HTTP Basic 认证(Authorization: Basic <token>)。9. RequestCacheAwareFilter缓存请求,用于登录成功后规复原始请求(如访问 /admin 被拦截后跳转登录页)。10. SecurityContextHolderAwareRequestFilter包装请求对象(HttpServletRequest),提供安全相干方法(如 isUserInRole)。11. AnonymousAuthenticationFilter为未认证用户分配匿名身份(默认角色 ROLE_ANONYMOUS)。12. SessionManagementFilter管理会话(如并发控制、会话固定攻击防护)。13. ExceptionTranslationFilter处理认证/授权异常,触发 AuthenticationEntryPoint(如跳转登录页)或返回 403。14. FilterSecurityInterceptor终极授权决议,调用 AccessDecisionManager 验证用户是否有权访问资源。
二、过滤器链工作原理

1. 责任链模式(Chain of Responsibility)

实行顺序:请求按过滤器链的顺序依次通过每个过滤器,每个过滤器可选择处理请求或通报给下一个过滤器。
制止条件:当某个过滤器处理完请求并直接返回响应时,后续过滤器不再实行。
2. 核心流程

  1. HTTP 请求 → 过滤器1 → 过滤器2 → ... → 过滤器N → 访问资源
  2.           ↓          ↓               ↓
  3.           处理逻辑    处理逻辑         处理逻辑
复制代码
认证流程
• UsernamePasswordAuthenticationFilter 提取凭据并认证 → 存储 Authentication 到 SecurityContextHolder。
授权流程
• FilterSecurityInterceptor 终极验证权限 → 若未授权则抛出 AccessDeniedException。
异常处理
• ExceptionTranslationFilter 捕获异常 → 触发登录页跳转或返回 403。
3. 关键交互示例

  1. 用户访问受保护资源(如 `/admin`):
  2. 1. SecurityContextPersistenceFilter 加载 SecurityContext(若已登录则存在 Authentication)。
  3. 2. AnonymousAuthenticationFilter 为未认证用户赋予匿名身份。
  4. 3. FilterSecurityInterceptor 检查权限 → 发现未认证 → 抛出 AccessDeniedException。
  5. 4. ExceptionTranslationFilter 捕获异常 → 调用 AuthenticationEntryPoint 跳转登录页。
  6. 5. 用户提交登录表单 → UsernamePasswordAuthenticationFilter 认证成功 → 更新 SecurityContext。
  7. 6. 用户再次访问 `/admin` → FilterSecurityInterceptor 验证权限 → 允许访问。
复制代码

三、如何查看和配置过滤器链

1. 查看默认过滤器链

在日记中设置 DEBUG 级别:
  1. logging.level.org.springframework.security.web.FilterChainProxy=DEBUG
复制代码
启动应用后,日记会输出默认过滤器链顺序:
  1. Security filter chain: [
  2.   WebAsyncManagerIntegrationFilter
  3.   SecurityContextPersistenceFilter
  4.   HeaderWriterFilter
  5.   CsrfFilter
  6.   LogoutFilter
  7.   ...
  8. ]
复制代码
2. 自定义过滤器链

通过 HttpSecurity 配置添加、移除或调整过滤器:
  1. @Bean
  2. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  3.     http
  4.         // 禁用默认表单登录过滤器
  5.         .formLogin(AbstractHttpConfigurer::disable)
  6.         // 添加自定义过滤器(如 JWT 过滤器)
  7.         .addFilterBefore(jwtAuthFilter(), UsernamePasswordAuthenticationFilter.class)
  8.         // 配置权限规则
  9.         .authorizeHttpRequests(auth -> auth
  10.             .requestMatchers("/admin/**").hasRole("ADMIN")
  11.             .anyRequest().permitAll()
  12.         );
  13.     return http.build();
  14. }
复制代码

四、常见过滤器的扩展场景

1. 添加自定义过滤器

  1. public class CustomAuthFilter extends OncePerRequestFilter {
  2.     @Override
  3.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
  4.         // 自定义认证逻辑(如验证请求头中的 Token)
  5.         chain.doFilter(request, response);
  6.     }
  7. }
  8. // 注册到过滤器链
  9. http.addFilterBefore(new CustomAuthFilter(), BasicAuthenticationFilter.class);
复制代码
2. 禁用默认过滤器

  1. http.csrf(csrf -> csrf.disable()); // 禁用 CSRF 防护
复制代码
3. 调整过滤器顺序

  1. // 将自定义过滤器插入到 CsrfFilter 之后
  2. http.addFilterAfter(new CustomFilter(), CsrfFilter.class);
复制代码

五、总结

Spring Security 的过滤器链通过责任链模式实现灵活的安全控制,核心特点包括:

  • 模块化:每个过滤器专注单一职责(如认证、授权、CSRF 防护)。
  • 可扩展:支持自定义过滤器插入恣意位置。
  • 顺序敏感:过滤器实行顺序影响安全举动(如 CsrfFilter 必须在认证过滤器之前实行)。
理解过滤器链的构成和实行逻辑,是调试安全题目和实现复杂安全需求的关键。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表