4
respostas

[Projeto] Dúvida em relação ao login do usuário

Estou criando um projeto com base no do curso, de login e registro de usuário, mas esta acontecendo um erro na hora do login. Um erro 403 Forbidden. Decidi colocar alguns System.out.println para ver onde estava dando o problema.

@PostMapping("/login")
    public ResponseEntity login(@RequestBody @Valid AuthenticationDTO data){

        System.out.println(data); // ESSE ESTÁ APARECENDO NO CONSOLE
        var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
        System.out.println(usernamePassword); // ESSE ESTÁ APARECENDO NO CONSOLE TAMBÉM
        var auth = this.manager.authenticate(usernamePassword);
        System.out.println(auth); // JÁ ESSE NÃO ESTÁ APARECENDO NO CONSOLE

        var token = tokenService.generateToken((User) auth.getPrincipal());
        System.out.println(token); //  ESSE TAMBÉM NÃO

        return ResponseEntity.ok(new LoginResponseDTO(token));
    }

No console:

...
AuthenticationDTO[login=pedrot@hotmail.com, password=pedro1234567]
UsernamePasswordAuthenticationToken [Principal=pedrot@hotmail.com, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]

Verifiquei se tinha algum erro no SecurityConfiguration, na parte da cração da função AuthenticationManager e nada:

@Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

Verifiquei também se a url "/auth/login" estava autorizada para entrar e ela está:

return  httpSecurity
                .csrf(csrf -> csrf.disable())
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers(HttpMethod.POST, "/auth/register").permitAll()
                        .requestMatchers(HttpMethod.POST, "/auth/login").permitAll()
                        .anyRequest().authenticated()
                )
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

A url "/auth/register" está funcionando.

Estou a um tempo quebrando a cabeça nesse problema e nada. Caso queiram ver o código por completo: https://github.com/Pedro-Thomazi/login_register_JAVA/tree/main

4 respostas

Oi!

Dá uma olhada em todas as possibilidades listadas aqui: https://cursos.alura.com.br/course/spring-boot-aplique-boas-praticas-proteja-api-rest/task/130894

Deu certo aqui professor, colocar o try catch ajudou de mais. Mas tenho uma outra pergunta: Na registro do usuário, "/register", posso usar a mesma lógica do login para criar um token para o usuário, sem que ele precise fazer o login, fazendo o usuário ao se registrar ficar autenticado e ir para a home. Tipo assim:

@PostMapping("/register")
@Transactional
    public ResponseEntity register(@RequestBody @Valid RegisterDTO data) {
        if (this.repository.findByLogin(data.login()) != null) return ResponseEntity.badRequest().build();

        String encriptedPassword = new BCryptPasswordEncoder().encode(data.password());
        User newUser = new User(data.login(), encriptedPassword, data.role());

        this.repository.save(newUser);

        var usernamePassword = new UsernamePasswordAuthenticationToken(data.login(), data.password());
        var auth = this.manager.authenticate(usernamePassword);

        var token = tokenService.generateToken((User) auth.getPrincipal());

        return ResponseEntity.ok(new LoginResponseDTO(token));
    }

Boa.

Sim, dá para fazer essa lógica de já autenticar o usuário no cadastro, do jeito que você implementou mesmo.

Obs: você pode injetar o passwordEncoder, para não precisar instanciar manualmente:

@Autowired
private PasswordEncoder encoder;

Boa, muito obrigado professor.