【发布时间】:2015-07-27 01:23:31
【问题描述】:
我有一个使用 Spring-Security 的 Spring-Boot 应用程序。我有一个请求范围的 bean,我想将它自动装配到安全过滤器链中的一个自定义过滤器中,但目前它不起作用。
我了解在 DispatcherServlet 之外使用请求范围的 bean 需要进行一些配置,并且已阅读此 http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes-other 但尚未取得任何成功:
对于 Servlet 3.0+,这可以通过 WebApplicationInitializer 接口。
(我使用的是最新的 Tomcat,servlet 3+ 也是)
我尝试过同时使用 RequestContextListener 和 RequestContextFilter(文档说它们和 DispatcherServlet 执行完全相同的操作),但在这两种情况下我仍然会遇到错误,因为我的自动装配对象为空:
我尝试注册过滤器
@Configuration
@ComponentScan
@EnableAutoConfiguration
class Application extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
application.sources( Application )
}
@Override public void onStartup( ServletContext servletContext ) throws ServletException {
super.onStartup( servletContext )
servletContext.addFilter("requestContextFilter", new RequestContextFilter() ).addMappingForUrlPatterns(null, false, "/*")
}
我尝试注册监听器
@Configuration
@ComponentScan
@EnableAutoConfiguration
class Application extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
application.sources( Application )
}
@Override public void onStartup( ServletContext servletContext ) throws ServletException {
super.onStartup( servletContext )
servletContext.addListener( new RequestContextListener() )
}
我是否遗漏了一些明显的东西?我已经查看了 Spring Boot 的自动配置源代码,但还没有遇到任何东西。
更新
我是个白痴,我在我的 SpringSecurity 配置中添加了我的过滤器,在 configure() 方法中:
http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )
但尚未将新过滤器注册为 Bean。根据下面 M. Denium 的评论,我不需要所有额外的配置显式添加侦听器/过滤器,只需注册 bean 就足够了。
【问题讨论】:
-
你让它变得复杂。只需添加一个构造
RequestContextListener的@Bean方法。 Spring Boot 将完成剩下的工作。但是,由于 Spring 安全过滤器链受 Spring 控制,因此不需要这样做,因此除非您在实际过滤器链之外执行操作,否则您需要注册它,否则它应该可以工作。 -
谢谢@M.Deinum - 原来我是个白痴 - 我已经用细节更新了问题,但基本上没有正确注册过滤器。
-
@M.Deinum: 自定义
AuthenticationProvider是否被视为“在实际过滤器链之外”?如果没有,那么这样的提供者是否可以访问已初始化的RequestContextHolder而无需显式配置RequestContextListener?
标签: spring spring-mvc spring-security spring-boot