Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

[Error] No logro obtener el JWT en proyecto Spring

Qué tal comunidad, buen día!

La situación es la siguiente: Generé un proyecto Spring implementando la capa de Seguridad para hacer la Autenticación obteniendo un JWT (tal como en los cursos), el problema que presento es que no logro hacer la Autenticación precisamente; en Insomnia obtengo un error 403 Forbidden.

Para revisar un poco la ejecución del código puse unos "sysouts" mi clase AutenticacionController:

@RestController
@RequestMapping("/login")
public class AutenticacionController {

    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private JWTService jwtService;

    @PostMapping
    public ResponseEntity autenticarUsuario(@Valid @RequestBody DtoLoginUsuario datosLogin){
        System.out.println("inicio de método");
        Authentication authe = new UsernamePasswordAuthenticationToken(datosLogin.login(), datosLogin.clave());
        System.out.println("datos recibidos");      // <-- Hasta aquí se imprime en Consola
        var usuarioAutenticado = authenticationManager.authenticate(authe);
        System.out.println("datos autenticados");
        var jwt = jwtService.generarToken((Usuario) usuarioAutenticado.getPrincipal());
        System.out.println("token generado");
        return ResponseEntity.ok(new DtoJWT(jwt));
    }
}

La búsqueda en mi UsuarioRepository sí se ejecuta, pero hasta ahí llega. Por lo que entiendo, creo que el problema puede ser que Spring no está obteniendo bien los datos de mi usuario para realizar el proceso de Autenticación con el AuthenticationManager o que la petición está siendo bloqueada por el SecurityFilterChain; esta es la clase en donde hago la configuración de seguridad:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {

    @Autowired
    private SecurityFilter securityFilter;

    @Bean
    public SecurityFilterChain securityFilterChain (HttpSecurity httpSecurity) throws Exception{
        return httpSecurity.csrf(csrf -> csrf.disable())
                .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(
                        (authorizeHttpRequests)->authorizeHttpRequests
                                .requestMatchers("/login").permitAll()
                                .requestMatchers("/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()
                                .anyRequest().authenticated()
                        )
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

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

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

Query impresa en consola:

Hibernate: 
    select
        u1_0.id,
        u1_0.login,
        u1_0.password 
    from
        usuarios u1_0 
    where
        u1_0.login=?

Estuve revisando mis apuntes, pero no logro identificar cuál es la discrepancia (fuera de la diferencia en el nombre de las Variables) y espero no estarme olvidando de algún detalle importante; ¿cómo podría resolver esta situación?

1 respuesta
solución!

Ya pude identificar qué me hizo falta en el código!

Fue al momento de implementar el "UserDetails" en mi clase Usuario; revisé que los Métodos que se implementan tuviera seteados bien los valores para el usuario que se está creando y que las Querys estuvieran bien escritas