Como autenticar manualmente o usuário com o Spring Security

Como autenticar manualmente o usuário com o Spring Security

1. Visão geral

Neste artigo rápido, vamos nos concentrar em como definir programaticamente um usuário autenticado no Spring Security e Spring MVC.

2. Spring Security

Simplificando, o Spring Security mantém as informações principais de cada usuário autenticado em umThreadLocal - representado como um objetoAuthentication.

A fim de construir e definir esse objetoAuthentication - precisamos usar a mesma abordagem que o Spring Security normalmente usa para construir o objeto em uma autenticação padrão.

Para, vamos acionar manualmente uma autenticação e, em seguida, definir o objetoAuthentication resultante noSecurityContext atual usado pela estrutura para manter o usuário conectado no momento:

UsernamePasswordAuthenticationToken authReq
 = new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
securityContext.setAuthentication(auth);

Depois de definirAuthentication no contexto, agora seremos capazes de verificar se o usuário atual está autenticado - usandosecurityContext.getAuthentication().isAuthenticated().

3. Spring MVC

Por padrão, Spring Security adiciona um filtro adicional na cadeia de filtros Spring Security - que é capaz de persistir o Contexto de Segurança (classeSecurityContextPersistenceFilter).

Por sua vez, ele delega a persistência do Contexto de Segurança a uma instância deSecurityContextRepository, padronizando para a classeHttpSessionSecurityContextRepository.

Portanto, para definir a autenticação na solicitação e, portanto,make it available for all subsequent requests from the client, precisamos definir manualmente oSecurityContext contendo oAuthentication na sessão HTTP:

public void login(HttpServletRequest req, String user, String pass) {
    UsernamePasswordAuthenticationToken authReq
      = new UsernamePasswordAuthenticationToken(user, pass);
    Authentication auth = authManager.authenticate(authReq);

    SecurityContext sc = SecurityContextHolder.getContext();
    sc.setAuthentication(auth);
    HttpSession session = req.getSession(true);
    session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc);
}

SPRING_SECURITY_CONTEXT_KEY é umHttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY importado estaticamente.

Deve-se notar que não podemos usar diretamente oHttpSessionSecurityContextRepository - porque ele funciona em conjunto com oSecurityContextPersistenceFilter.

Isso ocorre porque o filtro usa o repositório para carregar e armazenar o contexto de segurança antes e depois da execução do restante dos filtros definidos na cadeia, mas usa um wrapper personalizado sobre a resposta que é passada para a cadeia.

Portanto, nesse caso, você deve conhecer o tipo de classe do wrapper usado e passá-lo para o método de salvamento apropriado no repositório.

4. Conclusão

Neste tutorial rápido, vimos como definir manualmente oAuthentication do usuário no contexto do Spring Security e como ele pode ser disponibilizado para fins do Spring MVC, com foco nos exemplos de código que ilustram a maneira mais simples de fazer isso.

Como sempre, as amostras de código podem ser encontradasover on GitHub.