Wiem, że istnieje wiele artykułów na ten temat, ale mam problem i nie mogę znaleźć żadnego rozwiązania.Wylogowanie z usługi Spring Security nie działa - nie usuwa kontekstu zabezpieczeń, a uwierzytelniony użytkownik nadal istnieje.
mam klasyczną java bezpieczeństwo wiosna 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);
}
...
}
Ponadto, mam dwie metody kontrolera, gdzie Logowanie/wylogowanie z mojej aplikacji internetowych AJAX.
Kiedy chcę się wylogować, najpierw nazywam tę metodę, która polega na usuwaniu sesji użytkownika i usuwaniu wszystkiego z kontekstu zabezpieczeń.
@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);
}
Po tym ja odświeżyć moją aplikację internetową klienta i za każdym razem, gdy jest załadowany, to sprawdzić, czy użytkownik jest uwierzytelniony przez wywołanie następującej metody kontrolera:
@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;
}
i tu wynos odbierać ostatni uwierzytelniony użytkownik. Wygląda na to, że w poprzedniej metodzie wylogowania Spring Logout nie działa.
Należy pamiętać, że starałem się wylogować z następującego kodu, bez powodzenia:
@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);
}
}
Czy masz jakiś pomysł, co mi brakuje w moim config i procesu wylogowania?
Witam, Freezy. Właściwie miałeś rację - wymieszałem oba sposoby konfiguracji. To, co robię, to usunąć tylko kod z mojego SecurityConfig związanego z wylogowaniem i zachować bieżącą implementację kontrolera. Teraz działa poprawnie. Dzięki – Streetsouls
próbowałem twojej pierwszej metody, ale to nie działa ... –
To samo co Black Swan, pierwsza prośba o metodę z POST lub GET i z lub bez sprawdzenia CSRF, przekierowuje mnie, ale wciąż jestem zalogowany :(wszelkie pomysły na wierzchu swoich umysłów? – Alex