2017-09-20 1 views
2

Comment activer une sécurité webflux dans un emballage de guerre . J'utilise le Spring 5 intégré AbstractAnnotationConfigDispatcherHandlerInitializer, mais cela ne fonctionne pas.Comment activer Spring Security dans une application webflux war

public class AppIntializer extends AbstractAnnotationConfigDispatcherHandlerInitializer { 

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

Mais il semble que le Spring WebFilter n'est pas activé. Spring Security 5 n'inclut pas de WebApplicationInitializer spécifique au Reactor pour activer la chaîne de filtres de sécurité Spring.

Stack: Spring Security 5.0.0.M4

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

Répondre

0

Vous devriez être en mesure d'utiliser simplement AbstractAnnotationConfigDispatcherHandlerInitializer. Cependant, il existe un bug dans AbstractDispatcherHandlerInitializer. Vous pouvez contourner le problème en utilisant:

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); 
    } 
} 

En vous pouvez prolonger Spring 5.0.2.RELEASE + (prévue pour le 15 novembre 2017) AbstractReactiveWebInitializer à la place.

public class AppIntializer extends AbstractReactiveWebInitializer { 

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

Malheureusement, 'AbstractReactiveWebInitializer' ne fonctionnait pas dans mon exemple. Je l'ai mis à jour à Spring Boot 2.0.0.M7 (qui contient Spring 5.0.2.RELEASE), il semble que 'AbstractReactiveWebInitializer' n'a pas actualisé le' applicationContext', j'ai outrepassé la méthode 'createApplicationContext' pour surmonter cette barrière, voir [ici ] (https://github.com/hantsy/spring-reactive-sample/blob/master/war/src/main/java/com/example/demo/AppIntializer.java#L51-L57), le 'AnnotationConfigApplicationContext (configClasses) 'inclut une action ** refresh **, mais pas le constructeur par défaut. – Hantsy