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.