【问题标题】:SpringSecurity: FilterChainProxy: VirtualFilterChain --> What populates the originalChain?Spring Security: FilterChainProxy: Virtual FilterChain --> 什么填充了原始链?
【发布时间】:2021-09-12 19:40:15
【问题描述】:

我正在编写一个新的 spring 安全配置。我需要使用自己的配置/过滤器导入其他一些公司库。每个带有@Component/@Bean 注解的过滤器都出现在 FilterChainProxy 的“originalChain”属性中,并在请求时运行。我搜索了文档,但无法弄清楚 originalChain 属性是什么,为什么它在那里,是什么决定了那里的过滤器等等。我想停止运行未使用的过滤器。

一篇文章将其描述为“ originalChain 代表原生过滤器链,即Web Filter”,我一直没弄明白是什么意思。

什么是原始链?

【问题讨论】:

  • 我不确定什么代码在这里有用,但我可以发布任何需要的东西。

标签: java spring-boot spring-security


【解决方案1】:

每个 Servlet 应用程序可以在到达实际的 Servlet 之前执行多个 Filter 实现。大局是这样的:

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

考虑到这张图,我们可以说DelegatingFilterProxy 是 Spring MVC 在注册过滤器时使用自己的标准的一种方法。

当您公开一个实现 Filter 的 Spring Bean 时,它将在 DelegatingFilterProxy 中注册。

FilterChainProxy 是 Spring Security 提供的一个特殊的Filter,它允许通过SecurityFilterChain 委托给多个Filter 实例。由于FilterChainProxy 是一个Bean,它通常被包裹在DelegatingFilterProxy 中。

您可以看到上面这张假设图片将FilterChainProxy 作为过滤器链(虚线框)中的第二个过滤器。一旦FilterChainProxy 处理完它的SecurityFilterChain 过滤器,它将调用originalChain(虚线框)来恢复对剩余过滤器的处理,在上述场景中,Filter2。

Spring Security reference 中也有很好的解释,我在这里获取了本文中的大部分资源。

如果想防止Filter被Spring注册,可以参考这个question on StackOverflow

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 2013-06-11
    • 2015-02-27
    • 1970-01-01
    • 2012-06-15
    • 2018-10-14
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多