如何在 webflux war 应用程序中激活 Spring 安全性

How to activate Spring Security in a webflux war application

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

public class AppIntializer extends AbstractAnnotationConfigDispatcherHandlerInitializer {

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

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

堆栈:Spring安全 5.0.0.M4

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

您应该可以只使用 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
        };
    }
}