为什么 Spring 的 `AuthenticationWebFilter` 有自己的匹配器来检查请求是否需要身份验证?

Why does Spring's `AuthenticationWebFilter` have it's own matcher for checking if a request needs authentication?

正如标题所说; AuthenticationWebFilter 有自己的一组匹配器来确定请求是否需要身份验证。这似乎与 spring 安全的做事方式背道而驰。

如果在 spring 安全配置中将端点设置为 .permitAll(),它也必须在 AuthenticationWebFilter 中排除,为什么过滤器不让请求通过让 spring 的其他安全人员处理它?

编辑:重新构建我的问题以回应 作者:Steve Riesenberg:

为什么 AuthenticationWebFilter,一个身份验证过滤器,控制对资源的访问?这不应该由授权过滤器处理吗?

编辑:我刚刚发现过滤器在没有身份验证时实际上不会阻止访问,只有在验证失败时才阻止访问,这是有道理的。

我认为您问题的答案在于了解 Spring 安全性中的过滤器顺序和用途。您的问题特别引用了 AuthenticationWebFilter,它在反应式应用程序中使用。 Spring 安全文档有一个 comprehensive list of filters in order for servlet applications, but you can refer to the SecurityWebFiltersOrder 枚举,用于响应式应用程序中的类似排序。

在这两种情况下,您都可以看到“授权”(在 servlet 中为 FilterSecurityInterceptor,在反应式中为 AuthorizationWebFilter)实际上是列表中的最后一个过滤器。因此,如果您在 http.authorizeExchange() 中设置到 .permitAll() 的路由,您是在指示授权管理器允许该请求,假设它通过过滤器链中的所有其他过滤器。通过将 AuthenticationWebFilter 中的匹配器设置为同一路由,您要求 that 过滤器尝试对该路由进行身份验证,这将终止处理并且永远不会到达授权步骤。只有授权的请求才会到达您的应用程序代码,但某些请求可以在您的应用程序需要处理它们之前(而不是)由过滤器链处理。

简而言之,身份验证是 attempted/handled 先于授权。

我发现我的困惑是由于误解了 AuthenticationWebFilter 的工作原理。我的理解是它会阻止任何未成功通过身份验证的请求,但事实证明它只会阻止身份验证失败的请求。完全没有身份验证的请求将被允许通过。

这实际上是有道理的。

我没有仔细看这个过滤器,因为我记得类似的 servlet 过滤器以这种方式工作,AbstractAuthenticationFilter 或我认为的其他东西。我仍然很确定一个人是这样工作的,我仍然想知道为什么,但我不确定我会通过自己回答来结束这个问题。如果将来出现,我可能 post 另一个问题。

感谢回答的人!