2016-12-07 7 views
2

Mon fermeture de session application sert à la fois des pages Web et de repos (points d'extrémité de démarrage de printemps + printemps 4)Spring Security publie

Je suis en train de définir un InMemoryAuth de base, mais/fermeture de session ne fonctionne pas. A partir du navigateur, il redirige vers/logout? Logout avec un 404 et aucun effet sur la session de l'utilisateur.

@EnableWebSecurity 
@Configuration 
class WebSecurityConfig extends WebSecurityConfigurerAdapter { 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
     .antMatchers("/rest/**").hasRole("USER") 
     .antMatchers("/ui/**").hasRole("USER") 
     .and().logout() 
      .logoutUrl("/logout") 
     .and().httpBasic() 
     .and().csrf().disable(); 
    } 

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

EDIT

avec la chaîne followind

http 
    .authorizeRequests().anyRequest().authenticated() 
    .and().logout().logoutUrl("/logout").logoutSuccessUrl("/").permitAll() 
    .and().httpBasic() 
    .and().csrf().disable(); 

et une page de racine définie, aucune erreur 404.

Avec debug activé, je suis en mesure de voir

Logging out user 'org.springframew[email protected]442b5a9f: Principal: [email protected]: Username: user; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_USER' and transferring to logout destination 
Invalidating session: B264148444D372CFC899A5B920818B68 

mais le navigateur ne demande pas à l'utilisateur/passwd plus, je suis en mesure d'accéder à tous les urls ..

Répondre

2

Le succès par défaut Url pour la déconnexion est /login?logout. Puisque vous n'avez pas formLogin() configuré de sorte que vous aurez un /login c'est pourquoi vous obtenez un 404. vous feriez mieux de changer logout().logoutSuccessUrl("/") afin qu'il redirige vers la racine.

MISE À JOUR

Répondre à la section EDIT de la question. Vous avez HTTP Basic activé avec la suite

httpBasic() 

Ce qui signifie Une fois que vous entrez le nom d'utilisateur et mot de passe dans le menu contextuel qui navigateur donne le navigateur va envoyer l'en-tête suivant pour toutes les demandes que vous apportez à votre sécurité Spring site protégé.

Authorization: Basic base64(username+":"+password) 

C'est pourquoi vous pouvez accéder à toutes les URL. Il continuera à se connecter à l'utilisateur avec chaque demande si ce n'est déjà fait. Malheureusement, il n'y a pas de solution pour le moment. C'est selon Wikipedia.

navigateurs existants conservent des informations d'authentification jusqu'à ce que l'onglet ou navigateur est fermé ou l'utilisateur efface l'histoire. [1] Le protocole HTTP ne fournit pas de méthode permettant à un serveur d'ordonner aux clients de supprimer ces informations d'identification en cache . Cela signifie qu'il n'existe aucun moyen efficace pour un serveur de se déconnecter de l'utilisateur sans fermer le navigateur. Ceci est un défaut important qui nécessite que les fabricants de navigateurs supportent un élément d'interface utilisateur 'déconnexion' (mentionné dans RFC 1945, mais pas implémenté par la plupart des navigateurs) ou API disponible pour JavaScript, plus extensions de HTTP, ou l'utilisation de existants techniques alternatives telles que récupération de la page sur SSL/TLS avec une chaîne non accessible dans l'URL .

+1

qui est ce que je viens de découvrir ici http://stackoverflow.com/a/5033081/1853780 Je suppose que la solution est de diviser mon application en 2 applications séparées, l'une pour le repos avec auth de base, l'autre avec classique formulaire de connexion servant des pages Web. merci d'avoir répondu! –