Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] [Bug] Minha autenticação só retorna forbidden

Controller:

package com.example.Name.Spring.Security.studies.controller;

import com.example.Name.Spring.Security.studies.entities.user.AuthenticationDTO; import com.example.Name.Spring.Security.studies.entities.user.User; import com.example.Name.Spring.Security.studies.entities.user.registerDTO; import com.example.Name.Spring.Security.studies.repository.UserRepository; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;

@RestController @RequestMapping("/auth") public class AuthenticationController { @Autowired private AuthenticationManager authenticationManager;

@Autowired
private UserRepository userRepository;


@PostMapping("/login")
public ResponseEntity login(@RequestBody @Valid AuthenticationDTO data){
    var token = new UsernamePasswordAuthenticationToken(data.login(),data.password());
    var authentication = this.authenticationManager.authenticate(token);

    return ResponseEntity.ok().build();
}
@PostMapping("/register")
public ResponseEntity register(@RequestBody @Valid registerDTO data){
    if(this.userRepository.findByLogin(data.login()) != null) return ResponseEntity.badRequest().build();

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

    this.userRepository.save(newUser);

    return ResponseEntity.ok().build();
}

} SecurityConfiguration:

package com.example.Name.Spring.Security.studies.infra.security;

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain;

@Configuration @EnableWebSecurity public class SecurityConfiguration { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception { return httpSecurity .csrf(csrf -> csrf.disable()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authorize -> authorize .requestMatchers(HttpMethod.POST, "/auth/login").permitAll() .requestMatchers(HttpMethod.POST,"/auth/register").permitAll() .requestMatchers(HttpMethod.POST,"/api/products").hasRole("ADMIN") .anyRequest().authenticated() ) .build(); } @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { return authenticationConfiguration.getAuthenticationManager(); } @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } }

Requisição de Login

1 resposta
solução!

Olá, Gustavo!

Pela descrição do problema e pelo código fornecido, parece que você está enfrentando um problema de autenticação com o Spring Security, onde suas tentativas de login estão retornando um status 403 Forbidden. Vamos tentar resolver isso!

Primeiramente, o seu método de login parece estar correto, mas não está claro como você está tratando o objeto authentication após a autenticação ser bem-sucedida. Normalmente, você precisaria gerar um token JWT ou alguma outra forma de token de sessão que deveria ser retornado ao cliente para indicar uma autenticação bem-sucedida.

No entanto, o problema mais imediato que pode estar causando o status 403 Forbidden é a falta de configuração para o processo de autenticação no Spring Security. O método securityFilterChain em SecurityConfiguration está permitindo o acesso aos endpoints /auth/login e /auth/register sem autenticação, o que está correto, mas não há indicação de como o Spring Security deve tratar a autenticação quando ela ocorre.

Você precisa garantir que o Spring Security saiba como carregar os detalhes do usuário para realizar a autenticação. Isso geralmente é feito implementando e configurando um UserDetailsService que irá carregar os detalhes do usuário com base no login fornecido.

Além disso, verifique se o usuário e a senha que você está tentando autenticar estão corretos e se o usuário tem as permissões necessárias (roles) para acessar os recursos solicitados.

Aqui estão algumas etapas que você pode seguir para solucionar o problema:

  1. Certifique-se de que o usuário com o login "Gustavo Aquino" existe no banco de dados e que a senha está correta e criptografada com BCrypt, conforme você está fazendo no método register.

  2. Implemente e configure um UserDetailsService que irá carregar os detalhes do usuário do banco de dados.

  3. Certifique-se de que a configuração do Spring Security esteja correta e que você tenha configurado o AuthenticationManager e o UserDetailsService adequadamente.

  4. Verifique se não há outros filtros ou configurações no Spring Security que possam estar rejeitando a solicitação antes de chegar ao seu AuthenticationManager.

Espero que essas dicas ajudem a resolver o problema. Lembre-se de que a segurança é uma parte crítica de qualquer aplicação e deve ser tratada com cuidado. Teste as mudanças, qualquer coisa manda aqui de novo.

Espero ter ajudado e bons estudos!