web-dev-qa-db-fra.com

Spring Security permitAll () n'autorisant pas l'accès anonyme

J'ai une seule méthode que je veux autoriser à la fois l'accès anonyme et authentifié.

J'utilise Spring Security 3.2.4 avec une configuration Java).

La méthode de configuration remplacée (dans ma classe de configuration personnalisée qui étend WebSecurityConfigurerAdapter) a 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");

La méthode et le gestionnaire de requêtes ping se trouvent dans un contrôleur qui contient également le gestionnaire de connexion et ne comporte pas d'annotation @PreAuthorize distincte ni d'autres annotations pouvant être à l'origine du problème.

Le problème est que l'accès anonyme est refusé et que l'utilisateur est redirigé vers la page de connexion.

Lors de la journalisation au niveau du 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; Attributes: [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, c'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.

42
Zaan

L'ordre des permissions est important, cela fonctionne quand je le configure comme ceci:

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

J'ai vu le même problème. Assurez-vous que vous n'avez pas appelé
super.configure(http);
anyRequest().authenticated();
est appelé par défaut.

21
PeiSong

Besoin d'ajouter . Annoncymous ()

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éré de: https://stackoverflow.com/a/25280897/256245

3
Kris