【问题标题】:How to activate Spring Security in a webflux war application如何在 webflux 战争应用程序中激活 Spring Security
【发布时间】:2018-03-01 17:25:31
【问题描述】:

如何在 war 打包 应用程序中激活 webflux 安全性。我正在使用 Spring 5 内置的AbstractAnnotationConfigDispatcherHandlerInitializer,但是它不起作用。

public class AppIntializer extends AbstractAnnotationConfigDispatcherHandlerInitializer {

    @Override
    protected Class<?>[] getConfigClasses() {
        return new Class[]{
            WebConfig.class,
            SecurityConfig.class
        };
    }
}

但似乎没有启用 Spring Security WebFilter。 Spring Security 5 不包含特定于 Reactor 的 WebApplicationInitializer 来激活 Spring 安全过滤器链。

堆栈:Spring Security 5.0.0.M4

源码:https://github.com/hantsy/spring-reactive-sample/blob/master/war/src/main/java/com/example/demo/AppIntializer.java

【问题讨论】:

    标签: spring-security spring-webflux


    【解决方案1】:

    您应该可以只使用AbstractAnnotationConfigDispatcherHandlerInitializer。但是,AbstractDispatcherHandlerInitializer 中有一个bug。您可以使用以下方法解决此问题:

    public class AppInitializer extends AbstractAnnotationConfigDispatcherHandlerInitializer {
    
        @Override
        protected Class<?>[] getConfigClasses() {
            return new Class[]{
                WebConfig.class,
                SecurityConfig.class
            };
        }
    
        protected void registerDispatcherHandler(ServletContext servletContext) {
            String servletName = getServletName();
            ApplicationContext applicationContext = createApplicationContext();
    
            refreshApplicationContext(applicationContext);
            registerCloseListener(servletContext, applicationContext);
    
            HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext)
                .build();
            ServletHttpHandlerAdapter handlerAdapter = new ServletHttpHandlerAdapter(httpHandler);
    
            ServletRegistration.Dynamic registration = servletContext.addServlet(servletName, handlerAdapter);
    
            registration.setLoadOnStartup(1);
            registration.addMapping(getServletMapping());
            registration.setAsyncSupported(true);
    
            customizeRegistration(registration);
        }
    }
    

    在 Spring 5.0.2.RELEASE+(计划于 2017 年 11 月 15 日发布)中,您可以改为扩展 AbstractReactiveWebInitializer

    public class AppIntializer extends AbstractReactiveWebInitializer {
    
        @Override
        protected Class<?>[] getConfigClasses() {
            return new Class[]{
                WebConfig.class,
                SecurityConfig.class
            };
        }
    }
    

    【讨论】:

    • 不幸的是,AbstractReactiveWebInitializer 在我的示例中不起作用。我已经将它更新到 Spring Boot 2.0.0.M7(其中包含 Spring 5.0.2.RELEASE),似乎AbstractReactiveWebInitializer 没有刷新applicationContext,我覆盖了createApplicationContext 方法来克服这个障碍,见@987654322 @,AnnotationConfigApplicationContext(configClasses) 包含 refresh 操作,但默认构造函数没有。
    猜你喜欢
    • 2018-03-26
    • 2017-12-21
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2017-03-11
    • 2018-09-18
    • 2015-09-07
    • 2020-05-09
    相关资源
    最近更新 更多