Spring Security Logout
1. Visão geral
Este artigo é baseado em nossoForm Login tutorial e se concentrará em como configurarLogout with Spring Security.
Leitura adicional:
Spring Security: Autenticação com um UserDetailsService suportado por banco de dados
Um guia rápido para criar um UserDetailsService baseado em banco de dados personalizado para autenticação com o Spring Security.
Introdução à Spring Method Security
Um guia para segurança em nível de método usando a estrutura Spring Security.
Spring Security - Redirecionar para o URL anterior após o login
Um pequeno exemplo de redirecionamento após o login no Spring Security
2. Configuração básica
A configuração básica deSpring Logout functionality usando o métodologout() é simples o suficiente:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
//...
.logout()
//...
}
//...
}
E usando a configuração XML:
...
O elemento ativa o mecanismo de logout padrão - que é configurado para usar o seguintelogout url:/logout que costumava ser/j_spring_security_logout antes dehttps://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-xml.html#m3to4-xmlnamespace-logout.
3. O JSP e o link de logout
4. Personalizações avançadas
4.1. logoutSuccessUrl()
Depois que o processo de logout for realizado com sucesso, o Spring Security redirecionará o usuário para uma página especificada. Por padrão, esta é a página raiz (“/”), mas é configurável:
//...
.logout()
.logoutSuccessUrl("/afterlogout.html")
//...
Isso também pode ser feito usando a configuração XML:
Dependendo do aplicativo, uma boa prática é redirecionar o usuário de volta à página de login:
//...
.logout()
.logoutSuccessUrl("/login.html")
//...
4.2. logoutUrl()
Semelhante a outros padrões no Spring Security, a URL que realmente dispara o mecanismo de logout também tem um padrão -/logout.
No entanto, é uma boa ideia alterar esse valor padrão, para garantir que nenhuma informação seja publicada sobre qual estrutura é usada para proteger o aplicativo:
.logout()
.logoutUrl("/perform_logout")
E através do XML:
4.3. invalidateHttpSession edeleteCookies
Esses dois atributos avançados controlam a invalidação da sessão, bem como uma lista de cookies a serem excluídos quando o usuário efetua logout. Como tal,invalidateHttpSession permite que a sessão seja configurada de forma que não seja invalidada quando ocorre o logout (étrue por padrão).
O métododeleteCookies também é simples:
.logout()
.logoutUrl("/perform_logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
E a versão XML:
4.4. logoutSuccessHandler()
Para cenários mais avançados, onde o namespace não é flexível o suficiente, o beanLogoutSuccessHandler do contexto Spring pode ser substituído por uma referência personalizada:
@Bean
public LogoutSuccessHandler logoutSuccessHandler() {
return new CustomLogoutSuccessHandler();
}
//...
.logout()
.logoutSuccessHandler(logoutSuccessHandler());
//...
A configuração XML equivalente é:
...
Qualquercustom application logic that needs to run when the user successfully logs out pode ser implementado com o manipulador de sucesso de logout personalizado. Por exemplo - um mecanismo de auditoria simples que monitora a última página em que o usuário estava quando acionou o logout:
public class CustomLogoutSuccessHandler extends
SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {
@Autowired
private AuditService auditService;
@Override
public void onLogoutSuccess(
HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws IOException, ServletException {
String refererUrl = request.getHeader("Referer");
auditService.track("Logout from: " + refererUrl);
super.onLogoutSuccess(request, response, authentication);
}
}
Além disso, lembre-se de que esse bean personalizado tem a responsabilidade de determinar o destino para o qual o usuário é direcionado após o logout. Por isso, emparelhar o atributologoutSuccessHandler comlogoutSuccessUrl não vai funcionar, pois ambos cobrem funcionalidades semelhantes.
5. Conclusão
Neste exemplo, começamos configurando uma amostra simples de logout com o Spring Security e discutimos as opções mais avançadas disponíveis.
A implementação deste tutorial de logout do Spring pode ser encontrada emthe GitHub project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.
Quando o projeto é executado localmente, o HTML de amostra pode ser acessado em: