Spring Security Logout

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.

Read more

Introdução à Spring Method Security

Um guia para segurança em nível de método usando a estrutura Spring Security.

Read more

Spring Security - Redirecionar para o URL anterior após o login

Um pequeno exemplo de redirecionamento após o login no Spring Security

Read more

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.

Continuando com este exemplo simples, a maneira de fornecer umlogout link no aplicativo da web é:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

   
   
      ">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: