Как активировать Spring Security в военном приложении webflux

Как активировать безопасность 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


person Hantsy    schedule 20.09.2017    source источник


Ответы (1)


Вы должны иметь возможность просто использовать AbstractAnnotationConfigDispatcherHandlerInitializer. Однако в AbstractDispatcherHandlerInitializer есть ошибка. Вы можете обойти проблему, используя:

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+ (выпуск запланирован на 15 ноября 2017 г.) вместо этого вы можете расширить AbstractReactiveWebInitializer.

public class AppIntializer extends AbstractReactiveWebInitializer {

    @Override
    protected Class<?>[] getConfigClasses() {
        return new Class[]{
            WebConfig.class,
            SecurityConfig.class
        };
    }
}
person Rob Winch    schedule 01.11.2017
comment
К сожалению, AbstractReactiveWebInitializer не работал в моем образце. Я обновил его до Spring Boot 2.0.0.M7 (который содержит Spring 5.0.2.RELEASE), кажется, AbstractReactiveWebInitializer не обновил applicationContext, я переопределил метод createApplicationContext, чтобы преодолеть этот барьер, см. здесь AnnotationConfigApplicationContext(configClasses) включает действие обновить, а конструктор по умолчанию — нет. - person Hantsy; 03.12.2017