Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Fazer Login automático após o cadastro do Usuário

Boa tarde,

Estou tentando implementar uma forma de, após o Usuário fazer o cadastro, eu conseguir logar ele automaticamente.

Meu Controller de cadastro:

@RequestMapping(value = "/addUsuario", method = RequestMethod.POST)
    public ModelAndView adicionaUsuario(Usuario usuario, Endereco endereco,HttpServletRequest request) throws Exception{

        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String senhaEncode = encoder.encode(usuario.getSenha());

        usuario.setSenha(senhaEncode);
        usuario.setRoles("ROLE_USUARIO");

        Usuario usuarioCadastrado = UsuaDao.addUsuario(usuario);

        endereco.setUsuario(usuarioCadastrado);

        endDao.addEndereco(endereco);

        authenticateUserAndSetSession(usuarioCadastrado, request);

        return new ModelAndView("/");

    }

Pesquisando sobre como fazer isso cheguei no seguinte código:

private void authenticateUserAndSetSession(Usuario user, HttpServletRequest request) throws Exception {
        String username = user.getUsername();
        String password = user.getPassword();
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);


        request.getSession();

        token.setDetails(new WebAuthenticationDetails(request));
        Authentication authenticate2 = authenticationManager.authenticate(token);


        SecurityContextHolder.getContext().setAuthentication(authenticate2);
    }

Eu entendi parcialmente o que esse código faz, mas mesmo assim não funciona, quando faço um novo cadastro ele cai na pagina de Login padrão do Spring, mas é estranho pois eu deixei todas as paginas liberadas nas configurações.

Se alguém souber algum tutorial ou o porque o código está agindo dessa forma agradeço.

obrigado.

1 resposta
solução

Conseguir resolver da seguinte maneira se alguém quiser fazer esse procedimento de Auto Login, que eu acho bastante útil, pois o usuário só se cadastra e depois se for acessar alguma página bloqueada vai ter q colocar suas informações de novo, se torna maçante pra ele

retirei todo esse método a parte e fiz no controller mesmo adicionei apenas essa linha:

request.login(usuarioCadastrado.getEmail(), senha);

já havia feito isso antes mas mesmo assim não dava certo pois estava mandando a senha criptografada para o Spring e ele criptografa de novo.

então use a senha descriptografada para enviar.

Código completo.

    @RequestMapping(value = "/addUsuario", method = RequestMethod.POST)
    public ModelAndView adicionaUsuario(Usuario usuario, Endereco endereco, HttpServletRequest request,
            HttpServletResponse response) throws Exception {


        usuario.setSenha(new BCryptPasswordEncoder().encode(usuario.getSenha()));
        usuario.setRoles("ROLE_USUARIO");

        Usuario usuarioCadastrado = UsuaDao.addUsuario(usuario);
        endereco.setUsuario(usuarioCadastrado);
        endDao.addEndereco(endereco);

        request.login(usuarioCadastrado.getEmail(), usuario.getSenha());

        return new ModelAndView("redirect:/");

    }