SpringSecurity6从入门到实战之整合原生Filter链(源码级别讲解,建议耐心看完)

简介: SpringSecurity6从入门到实战之整合原生Filter链

SpringSecurity6从入门到实战之整合原生Filter链

DelegatingFilterProxy

从官网上来进行学习可以看到第一个类就是DelegatingFilterProxy,我们首先看看官网给下的定义.

Spring提供了一个名为DelegatingFilterProxy的过滤器实现,它允许在Servlet容器的生命周期和Spring的ApplicationContext之间架起桥梁。Servlet容器允许使用自己的标准注册过滤器实例,但它不知道Spring定义的Bean。您可以通过标准的Servlet容器机制注册DelegatingFilterProxy,但将所有工作委托给实现过滤器的Spring Bean

通过以上进行官网的翻译,我们知道了DelegatingFilterProxy是Servlet容器与Spring中bean容器的桥梁.我们在Spring框架中的Filter都是通过Bean注入的方式加载在容器中,在这可以得知DelegatingFilterProxy的作用就是实现把Serlet容器中的Filter和Spring容器中的Bean关联起来.所以当客户端请求进来先走过原生Filter之后就会到DelegatingFilterProxy进行关联.详细流程见下图.

下面可以看看相关源码

DelegatingFilterProxy

public class DelegatingFilterProxy extends GenericFilterBean {
  @Nullable
  private String contextAttribute;
  @Nullable
  private WebApplicationContext webApplicationContext;
  @Nullable
  private String targetBeanName;
  private boolean targetFilterLifecycle = false;
  @Nullable
  private volatile Filter delegate;
  private final Object delegateMonitor = new Object();
...
}

GenericFilterBean

public abstract class GenericFilterBean implements Filter, BeanNameAware, EnvironmentAware,
    EnvironmentCapable, ServletContextAware, InitializingBean, DisposableBean {
  /** Logger available to subclasses. */
  protected final Log logger = LogFactory.getLog(getClass());
  @Nullable
  private String beanName;
  @Nullable
  private Environment environment;
  @Nullable
  private ServletContext servletContext;
  @Nullable
  private FilterConfig filterConfig;
  private final Set<String> requiredProperties = new HashSet<>(4);
        ...
        }

DelegatingFilterProxy 类继承于抽象类 GenericFilterBean 间接 implements 了 javax.servlet.Filter 接口。SpringSecurity中的Filter是Spring工厂中的Bean,无法直接处理客户端请求,需要通过DelegatingFilterProxy 来进行搭建桥梁.

FiterChainProxy

Spring Security的Servlet支持包含在FilterChainProxy中。FilterChainProxy是Spring Security提供的一种特殊过滤器,允许通过SecurityFilterChain委托给多个Filter实例。因为FilterChainProxy是一个Bean,所以它通常包装在DelegatingFilterProxy中。

  • FilterChainProxy 类继承于抽象类 GenericFilterBean 间接 implements 了 javax.servlet.Filter 接口。
  • Servlet容器启动时自动调用
  • 作用:实现把 请求传递给一或多个 SecurityFilterChain 实例进行认证或授权等(根据客户端的请求去匹配是哪个SecurityFilterChain 中的过滤器),并在需要时重定向或返回错误信息。
  • 管理一或多个 SecurityFilterChain 过滤器链,这些过滤器链按顺序进行匹配,直到找到能处理当前请求的过滤器链为止。

SecurityFilterChain 接口

  • SecurityFilterChain 和 Servlet 中的 FilterChain 一样,同样维护了很多 Filter,这些 Filter 由 SpringSecurity 提供,每个 Filter 具有不同的职能。
  • Spring Security 支持添加1或多个 SecurityFilterChain,每个SecurityFilterChain负责不同的请求(比如依据请求地址进行区分),这样可以为不同的请求设置不同的认证规则。

小结:

  • Security Filter 并不是直接放在 Web 项目的原生 FilterChain 中,而是通过一个 FilterChainProxy 来统一管理
  • FilterChainProxy  是顶层管理者,统一管理 Security Filter 和 SecurityFIlterChain过滤器链
  • 当请求到达 FilterChainProxy 时,会根据当前请求匹配 SecurityFilterChain,然后将请求依次转发给 SecurityFilterChain 中的 Security Filter
  • FilterChainProxy 把 SecurityFilterChain 嵌入到 Web项目的原生过滤器链中
  • DelegatingFilterProxy 把 FilterChainProxy 整合到原生的过滤器链中

Security Filters

Spring Security 中最终对请求进行处理的就是某个 SecurityFilterChain 中的 Security Filter,这些Filter都设置为 Bean 注入到 Spring容器中,且会按照先后顺序执行。

下面展示 Spring Security 中给我们提供的过滤器,以及默认情况下会被加载的过滤器。

过滤器

过滤器作用

默认是否加载

DisableEncodeUrlFilter

禁用 URL 重新编码

YES

ForceEagerSessionCreationFilter

管理是否强制生成新session

NO

ChannelProcessingFilter

过滤请求协议 HTTP 、HTTPS

NO

WebAsyncManagerIntegrationFilter

将 WebAsyncManger 与 SpringSecurity 上下文进行集成

YES

SecurityContextHolderFilter

获取安全上下文

YES

SecurityContextPersistenceFilter

处理请求之前,将安全信息加载到 SecurityContextHolder 中

NO

HeaderWriterFilter

处理头信息加入响应中

YES

CorsFilter

处理跨域问题

NO

CsrfFilter

处理 CSRF 攻击

YES

LogoutFilter

处理注销登录

YES

OAuth2AuthorizationRequestRedirectFilter

处理 OAuth2 认证重定向

NO

Saml2WebSsoAuthenticationRequestFilter

处理 SAML 认证

NO

X509AuthenticationFilter

处理 X509 认证

NO

AbstractPreAuthenticatedProcessingFilter

处理预认证问题

NO

CasAuthenticationFilter

处理 CAS 单点登录

NO

OAuth2LoginAuthenticationFilter

处理 OAuth2 认证

NO

Saml2WebSsoAuthenticationFilter

处理 SAML 认证

NO

UsernamePasswordAuthenticationFilter

处理表单登录

YES

OpenIDAuthenticationFilter

处理 OpenID 认证

NO

DefaultLoginPageGeneratingFilter

配置默认登录页面

YES

DefaultLogoutPageGeneratingFilter

配置默认注销页面

YES

ConcurrentSessionFilter

处理 Session 有效期

NO

DigestAuthenticationFilter

处理 HTTP 摘要认证

NO

BearerTokenAuthenticationFilter

处理 OAuth2 认证的 Access Token

NO

BasicAuthenticationFilter

处理 HttpBasic 登录

YES

RequestCacheAwareFilter

处理请求缓存

YES

SecurityContextHolderAwareRequestFilter

包装原始请求

YES

JaasApiIntegrationFilter

处理 JAAS 认证

NO

RememberMeAuthenticationFilter

处理 RememberMe 登录

NO

AnonymousAuthenticationFilter

配置匿名认证

YES

OAuth2AuthorizationCodeGrantFilter

处理OAuth2认证中授权码

NO

SessionManagementFilter

处理 session 并发问题

NO

ExceptionTranslationFilter

处理认证/授权中的异常

YES

FilterSecurityInterceptor

对请求进行权限判断

NO

AuthorizationFilter

对请示进行访问权限处理

YES

SwitchUserFilter

处理账户切换

NO

Spring Security 提供了 30 多个过滤器。默认情况下Spring Boot 在对 Spring Security 进行自动化配置时,会创建一个名为 SpringSecurityFilerChain 的过滤器,并注入到 Spring 容器中,这个过滤器将负责所有的安全管理,包括用户认证、授权、重定向到登录页面等.

这里我们通过源码来查看SpringBoot在自动化配置时是不是加载了以上的15个过滤器,SpringSecurityFilerChain是通过SpringSecurity的配置类进行加载的,那么我们进入WebSecurityConfiguration源码:

可以发现这个bean的名称就是springSecurityFilerChain,我们打上断点看看默认进行加载的过滤器有哪些

最终可以发现确实加载了这15个过滤器进来

相关文章
|
Java 数据安全/隐私保护 Spring
SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解(源码级别讲解,耐心)
该内容是关于SpringSecurity在SpringBoot中的自动配置详解。文章首先提出问题:SpringSecurity如何在引入依赖后使所有请求需认证并显示登录表单。接着,它探讨了SpringBoot的自动装配原理,从@SpringBootApplication注解开始,深入到@EnableAutoConfiguration的实现,解释了如何通过扫描jar包中的.imports文件来加载自动配置类。特别提到了SpringBootWebSecurityConfiguration类,该类默认设置为对所有请求进行认证,并支持表单和Basic认证。
|
Ubuntu Linux 数据安全/隐私保护
Windows11 使用 WSL2部署Ubuntu
在管理员PowerShell中运行命令启用Windows子系统Linux和虚拟机平台,但安装Ubuntu时遇到错误。解决方法是下载NoLsp_fix_WSL2工具,以管理员权限进入其目录,使用工具指向WSL的路径(例如 `C:\windows\system32\wsl.exe`)进行修复,然后能成功打开Ubuntu。
561 4
|
机器学习/深度学习 Kubernetes 网络协议
K8s单机架构部署
这是我做了很多遍,参考很多文章得到的,为了便于大家参考和学习,我已经把每一步都整理出来了,步骤和提示都很清晰。 后续文档有什么问题那个地方写错了,大家都可以提出来。
1974 1
K8s单机架构部署
|
3月前
|
监控 网络协议 Shell
内网穿透与代理:Netcat隧道技术深度解析
本文深入解析Netcat内网穿透隧道技术,结合典型网络拓扑,详解通过边界服务器建立反向Shell隧道的三步流程,剖析数据流向与协议机制,涵盖渗透测试应用、高级持久化与加密变种,并探讨防御检测及替代工具,助力红蓝双方提升实战能力。(238字)
420 5
|
6月前
|
安全 Java 数据安全/隐私保护
Springboot应用开发-SpringBootSecurity
Spring Boot Security 是 Spring 提供的安全框架,集成了身份认证和授权功能,帮助开发者快速构建安全的应用程序。本篇博客将从功能介绍到配置和实践,带您全面了解 Spring Boot Security。
1017 1
Springboot应用开发-SpringBootSecurity
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
4013 2
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
1177 2
Spring Security 6.x OAuth2登录认证源码分析
|
安全 前端开发 Java
Spring Security 6.x 过滤器链SecurityFilterChain是如何工作的
上一篇主要介绍了Spring Secuirty中的过滤器链SecurityFilterChain是如何配置的,那么在配置完成之后,SecurityFilterChain是如何在应用程序中调用各个Filter,从而起到安全防护的作用,本文主要围绕SecurityFilterChain的工作原理做详细的介绍。
1499 0
Spring Security 6.x 过滤器链SecurityFilterChain是如何工作的
|
安全 Java 数据安全/隐私保护
Spring Security 6.x 一文快速搞懂配置原理
本文主要对整个Spring Security配置过程做一定的剖析,希望可以对学习Spring Sercurity框架的同学所有帮助。
1019 5
Spring Security 6.x 一文快速搞懂配置原理
|
存储 数据库 数据安全/隐私保护
SpringSecurity6从入门到实战之登录表单的提交
SpringSecurity6 教程探讨了登录表单提交的源码流程。当提交登录表单时,`UsernamePasswordAuthenticationFilter` 负责处理认证,它从请求中获取 `username` 和 `password` 参数。然后,`AuthenticationManager` 的 `authenticate()` 方法被调用,进一步委托给 `AuthenticationProvider`,通常是 `DaoAuthenticationProvider`。`DaoAuthenticationProvider` 使用 `UserDetailsService`(如 `InMemo