Lo so, ci sono molti articoli su questo argomento, ma ho un problema e non riesco a trovare alcuna soluzione.Il logout di Spring Security non funziona - non cancella il contesto di sicurezza e l'utente autenticato esiste ancora
Ho un classico di sicurezza a molla java config:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuctionAuthenticationProvider auctionAuthenticationProvider;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(auctionAuthenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic();
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry authorizeRequest = http.authorizeRequests();
configureAdminPanelAccess(authorizeRequest);
configureFrontApplicationAccess(authorizeRequest);
configureCommonAccess(authorizeRequest);
http.csrf()
.csrfTokenRepository(csrfTokenRepository()).and()
.addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
http.logout()
.clearAuthentication(true)
.invalidateHttpSession(true);
}
...
}
Inoltre, ho due metodi controller, dove ho login/logout dalla mia applicazione web AJAX.
Quando desidero disconnettermi, prima chiamo questo metodo, che mi aspetto di cancellare le sessioni utente e cancellare tutto dal contesto di sicurezza.
@Override
@RequestMapping(value = "/logout", method = GET, produces = APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<Boolean> logout(final HttpServletRequest request, final HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null){
new SecurityContextLogoutHandler().logout(request, response, auth);
}
return new ResponseEntity<>(Boolean.TRUE, HttpStatus.OK);
}
Dopo questo ricarico il mio cliente applicazione web e ogni volta, quando viene ricaricato, controllo se l'utente è autenticato chiamando il seguente metodo di controllo:
@Override
@RequestMapping(value = "/user", method = GET, produces = APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<UserDetails> user() {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
return new ResponseEntity<>((UserDetails) principal, HttpStatus.OK);
}
return null;
}
e qui mi away ricevo l'ultimo utente autenticato. Sembra che nel precedente metodo di disconnessione, il logout di Spring non funzioni.
Tenete a mente che ho cercato di effettuare il logout con il seguente codice, senza alcun successo:
@Override
@RequestMapping(value = "/logout", method = GET, produces = APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<Boolean> logout(final HttpServletRequest request) {
try {
request.logout();
return new ResponseEntity<>(Boolean.TRUE, HttpStatus.OK);
} catch (ServletException ex) {
if (LOG.isDebugEnabled()) {
LOG.debug("There is a problem with the logout of the user", ex);
}
}
Sei una vaga idea di quello che mi manca nel mio config e il processo di logout?
Ciao, Freezy. In realtà, avevi ragione - ho mescolato entrambi i modi di configurazione. Quello che faccio è stato rimuovere solo il codice dal mio SecurityConfig relativo al logout e mantenere l'attuale implementazione del controller. Ora funziona correttamente. Grazie – Streetsouls
ho provato il primo metodo ma non funziona ... –
Come Black Swan, prima richiesta di metodo con POST o GET e con o senza controllo CSRF, mi reindirizza ma sono ancora loggato :(qualsiasi idea in cima alle tue menti? – Alex