Spring Security - Usuário de login automático após o registro
1. Visão geral
Neste tutorial rápido, discutiremos como autenticar usuários automaticamente após o processo de registro - em uma implementação do Spring Security.
Simplificando, depois que o usuário termina de se registrar, ele normalmente é redirecionado para a página de login e precisa digitar novamente seu nome de usuário e senha.
Vamos ver como podemos evitar isso autenticando automaticamente o usuário.
Antes de começarmos, observe que estamos trabalhando dentro do escopo deregistration series aqui no site.
2. Usando oHttpServletRequest
Uma maneira muito simples de forçar programaticamente uma autenticação é aproveitar o métodoHttpServletRequest login():
public void authWithHttpServletRequest(HttpServletRequest request, String username, String password) {
try {
request.login(username, password);
} catch (ServletException e) {
LOGGER.error("Error while login ", e);
}
}
Agora que, nos bastidores, a APIHttpServletRequest.login() usaAuthenticationManager para executar a autenticação.
Também é importante entender e lidar com osServletException que podem ocorrer neste nível.
3. Usando oAuthenticationManager
Em seguida, também podemos criar diretamente umUsernamePasswordAuthenticationToken - e então passar peloAuthenticationManager padrão manualmente:
public void authWithAuthManager(HttpServletRequest request, String username, String password) {
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password);
authToken.setDetails(new WebAuthenticationDetails(request));
Authentication authentication = authenticationManager.authenticate(authToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
Observe como estamos criando a solicitação de token, passando-a pelo fluxo de autenticação padrão e, em seguida, definindo explicitamente o resultado no contexto de segurança atual.
4. Registro complexo
Em alguns cenários mais complexos, o processo de registro possui vários estágios, como - por exemplo - uma etapa de confirmação até que o usuário possa efetuar login no sistema.
Em casos como esse, é claro, importante entender exatamente onde podemos autenticar o usuário automaticamente. Não podemos fazer isso logo após o registro, porque, nesse ponto, a conta recém-criada ainda está desativada.
Basta colocar -we have to perform the automatic authentication after they confirm their account.
Além disso, lembre-se de que, nesse ponto - não temos mais acesso às credenciais brutas reais. Só temos acesso à senha codificada do usuário - e é isso que usaremos aqui:
public void authWithoutPassword(User user){
List privileges = user.getRoles().stream()
.map(role -> role.getPrivileges())
.flatMap(list -> list.stream())
.distinct().collect(Collectors.toList());
List authorities = privileges.stream()
.map(p -> new SimpleGrantedAuthority(p.getName()))
.collect(Collectors.toList());
Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
Observe como estamos definindo as autoridades de autenticação corretamente aqui, como normalmente seria feito noAuthenticationProvider.
5. Conclusão
Discutimos maneiras diferentes de autenticar usuários após o processo de registro.
Como sempre, o código-fonte completo está disponívelover on GitHub.