2016-09-27 1 views
2

Je suis assez nouveau pour le printemps, donc désolé si ma question semble stupide. J'essaie d'ajouter l'authentification HTTP de base à mon API REST Spring.Printemps 4 Configuration de la sécurité s'exécute mais pas active

J'ai suivi quite a fewtutorials et reference documentations pour l'instant, mais ils semblent tous indiquer la même chose, donc il semble évident que je dois manquer quelque chose.

Ce que je veux est de définir une configuration simple où chaque requête est derrière HTTP Auth par défaut, mais nous pouvons définir la sécurité au niveau de la méthode que l'utilisation nécessaire @PreAuthorize, ou en modifiant la configuration HttpSecurity.

J'ai défini une configuration très simple en tant que tel:

@Configuration 
@EnableWebMvc 
@EnableWebSecurity 
@ComponentScan(basePackages = "com.app.rest") 
public class RESTConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .anyRequest().hasAnyRole("USER") 
       .and() 
       .httpBasic(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
    } 
} 

J'ai alors un contrôleur très simple (pas de service, rien d'extraordinaire).

Voici un aperçu très basique:

@RestController 
@RequestMapping("/images") 
public class ImagesController { 

    @JsonView(View.Basic.class) 
    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    public ObjectXvo getImageByID(@PathVariable String id) throws IOException { 

     ObjectXvo result = doThings(); 
     return result; 
    } 
} 

La seule différence notable par rapport à tous les tutoriels en ligne est la façon dont nous charger cette API. Parce que nous avons déjà un conteneur Jetty en cours d'exécution d'autres choses, nous avons décidé de le réutiliser au lieu d'utiliser un WebAppInitializer comme le font la plupart en ligne.

Voici un extrait de la façon dont l'API REST est définie:

// Creating REST Servlet 
ServletContextHandler restHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
restHandler.setErrorHandler(null); 
restHandler.setContextPath("/rest"); 

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
context.setConfigLocation("com.app.test"); 
WebApplicationContext webAppContext = context; 

DispatcherServlet dispatcherServlet = new DispatcherServlet(webAppContext); 
ServletHolder springServletHolder = new ServletHolder("REST dispatcher", dispatcherServlet); 
restHandler.addServlet(springServletHolder, "/"); 
restHandler.addEventListener(new ContextLoaderListener(webAppContext)); 

// Creating handler collection 
ContextHandlerCollection handlerCollection = new ContextHandlerCollection(); 
handlerCollection.addHandler(anotherHandler); 
handlerCollection.addHandler(restHandler); 
handlerCollection.addHandler(yetAnotherHandler); 

// Setting server context 
server.setHandler(handlerCollection); 

La chose est, lors de l'exécution de l'application, est que je peux encore accéder à toutes les URL comme si j'avais pas configuré tout régime de sécurité. Lors du débogage de l'application, je peux voir que le RESTConfiguration est en cours de traitement en tant que points d'arrêt dans mes méthodes de configuration sont définitivement touchés.

Nous nous efforçons d'éviter l'utilisation de fichiers XML aussi longtemps que nous le pouvons, car nous pensons que les annotations sont meilleures jusqu'à présent.

Est-ce que quelqu'un peut me diriger dans la bonne direction pour expliquer pourquoi cette configuration de sécurité n'est pas activée?

EDIT:

Je ne sais pas comment pertinent est, mais si je tente d'ajouter un @PreAuthorize à une méthode REST, je reçois l'erreur suivante:

HTTP ERROR: 500 

Problem accessing /rest/images/I147. Reason: 

    An Authentication object was not found in the SecurityContext 

Il y a beaucoup d'informations sur Internet sur la façon de résoudre ce problème, mais je me demande si ce n'est pas lié.

Répondre

1

Vous devez vous enregistrer springSecurityFilterChain, voir Spring Security Reference:

The next step is to register the springSecurityFilterChain with the war. This can be done in Java Configuration with Spring’s WebApplicationInitializer support in a Servlet 3.0+ environment. Not suprisingly, Spring Security provides a base class AbstractSecurityWebApplicationInitializer that will ensure the springSecurityFilterChain gets registered for you. The way in which we use AbstractSecurityWebApplicationInitializer differs depending on if we are already using Spring or if Spring Security is the only Spring component in our application.

Si vous n'utilisez pas AbstractSecurityWebApplicationInitializer vous devez vous enregistrer springSecurityFilterChain manuellement:

webAppContext.getServletContext() 
    .addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain")) 
    .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR, DispatcherType.ASYNC), false, "/*"); 

Voir aussi:

+0

Merci beaucoup! À la lumière des échantillons fournis auparavant, j'ai dû ajouter le filtre à restHandler. – jlengrand