Spring Security permitAll () n’autorisant pas l’access anonyme

J’ai une méthode unique que je veux autoriser à la fois un access anonyme et authentifié.

J’utilise Spring Security 3.2.4 avec une configuration Java.

La méthode configure remplacée (dans ma classe de configuration personnalisée qui étend WebSecurityConfigurerAdapter) comporte le bloc http suivant:

http .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class) .addFilterBefore(cf, ChannelProcessingFilter.class) .authorizeRequests() .anyRequest() .authenticated() .and() .authorizeRequests() .antMatchers("/ping**") .permitAll() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login"); 

Le gestionnaire et la méthode de requête ping se trouvent dans un contrôleur qui contient également le gestionnaire de connexion et ne comporte pas d’annotation @PreAuthorize ou autre pouvant causer le problème.

Le problème est que l’access anonyme est refusé et l’utilisateur est redirigé vers la page de connexion.

La journalisation au niveau de débogage, je vois les commentaires suivants de Spring Security:

 [2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Atsortingbutes: [authenticated] [2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS [2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@123f2882, returned: -1 [2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); redirecting to authentication entry point 

Ce que j’essaie d’accomplir est d’avoir une méthode qui peut être appelée à tout moment et qui enverra une réponse indiquant si la demande se trouve ou non à l’intérieur d’une session connectée.

L’ordre de permission est important, ça marche quand je le configure comme ceci:

 .authorizeRequests() .antMatchers("/ping**") .permitAll() .and() .authorizeRequests() .anyRequest() .authenticated() .and() 

J’ai vu le même problème. Assurez-vous de ne pas appeler
super.configure(http);
anyRequest().authenticated();
est appelé par défaut.

Besoin d’append .annonymous ()

 http .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class) .addFilterBefore(cf, ChannelProcessingFilter.class) .anonymous() .and() .authorizeRequests() .anyRequest() .authenticated() .and() .authorizeRequests() .antMatchers("/ping**") .permitAll() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login"); 

Référence: https://stackoverflow.com/a/25280897/256245