Spring Security - Usuário de login automático após o registro

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.