Spring Security Spring安全过滤器链和定义FilterRegistrationBean

aor9mmx1  于 2023-08-05  发布在  Spring
关注(0)|答案(1)|浏览(132)

我正在研究spring Boot + spring security和filter chain configuration,并注意到一些在spring文档中找不到相关信息的东西。
我有一个安全过滤器链配置,在那里我添加了几个自定义过滤器(使用http.addFilterBefore(...)
我还创建了一个Filter配置,它定义了几个FilterRegistrationBean<>方法。
当引导应用程序时,记录器打印SecurityFilterChain,它包含在安全过滤器链配置中定义的自定义过滤器,但是,我想知道其余的过滤器bean在servlet过滤器链中的位置。
我在使用spring security时检查了过滤器链架构,并知道DelegatingFilterProxy包含FilterChainProxy,而FilterChainProxy又包含所有安全过滤器,如每个SecurityFilterChain配置所定义的那样。
FilterRegistrationBean<>过滤器bean在servlet过滤器链中的什么位置?我喜欢它们提供的灵活性,但不知道如何放置它们才能正确排序我的过滤器链。

tjjdgumg

tjjdgumg1#

好了,我做了更多的调试和故障排除,找到了答案:
安全过滤器链位于requestContextFilter之后,作为一个单独的servlet容器过滤器。它包含所有内部过滤器,而FilterRegistrationBean<>过滤器注册为单独的servlet容器过滤器。
为了回答我自己的问题,将过滤器注册为FilterRegistrationBean<>会根据您指定的顺序将它们放在servlet容器过滤器链中,这意味着您可以根据需要将它们放在安全过滤器链的前面/后面。
在我的情况和观点中,首先应该考虑每个过滤器的目的:
1.只处理安全性的过滤器,例如身份验证,应该放在安全过滤器链中
1.一般的应用程序过滤器,例如日志过滤器应该注册为FilterRegistration<> bean,它最终会被放置在servlet过滤器链中

注意:* 请记住,安全过滤器不应声明为bean,因为这会将其放置为servlet容器过滤器,这可能会导致同一过滤器在过滤器链中被调用两次。*

相关问题