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?