Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

Access Denied al crear un constructor en Usuario.Java

Buenas noches, estoy tratando de añadir una funcionalidad al código que estamos viendo en el curso de Spring que registre las contraseñas de los usuarios pero encriptada con Bcrypt, con este código: (

    @Autowired
    private UsuarioRepository usuarioRepository;

    @PostMapping("/signup")
    public ResponseEntity registrarUsuario(@RequestBody DatosAutenticacionUsuario datosAutenticacionUsuario) {

    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String encryptedPassword = passwordEncoder.encode(datosAutenticacionUsuario.password());
    DatosAutenticacionUsuario datos = new DatosAutenticacionUsuario(datosAutenticacionUsuario.nombreusuario(), encryptedPassword);

    //usuarioRepository.save(new Usuario(datosAutenticacionUsuario.nombreusuario(), encryptedPassword));
    usuarioRepository.save(new Usuario(datos));

    return ResponseEntity.ok(null);
}

En Usuario cree el siguiente constructor:

public Usuario(DatosAutenticacionUsuario datos) {
    this.password = datos.password();
    this.nombreusuario = datos.nombreusuario();        
}

El código funciona perfectamente para grabar el password con Bcrypt, pero al momento de hacer un login por medio de una petición POST para obtener un JWT token, me devuelve esto:

{ "timestamp": "2023-05-18T22:09:40.140+00:00", "status": 403, "error": "Forbidden", "message": "Access Denied", "path": "/usuarios" }

Si borro o comento el constructor, el login vuelve a funcionar perfectamente devolviendo un JWT token tal como en clase. Que hago para que esto deje de suceder?

Saludos,

2 respuestas

Compañeros ya lo pude resolver sin la necesidad del constructor, pero si me gustaría entender por qué cuando se agrega el constructor el login ya no funciona.

Por si le sirve a alguien, este es el código:

@Autowired
    private UsuarioRepository usuarioRepository;
@PostMapping("/signup") 
    public ResponseEntity registrarUsuario(@RequestBody DatosAutenticacionUsuario datosAutenticacionUsuario) {
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    String encryptedPassword = passwordEncoder.encode(datosAutenticacionUsuario.password());

    Usuario datos = new Usuario();

    datos.setPassword(encryptedPassword);

    datos.setNombreusuario(datosAutenticacionUsuario.nombreusuario());

    usuarioRepository.save(datos);

    return ResponseEntity.ok(null);
}

Es que el contructor agrega el filtro para solicitar el token JWT, entonces primero tienes que inicializar la app, mandar un POST con el usuario y contraseña en un JSON (estos tiene. que coincidir con los que creaste en la base de datos) para que te regrese el token y ese toque lo añades en el header como Authentication bearer (el token), pero la verdad no sé porque lo pudiste resolver eliminando el constructor