Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Haga lo que hicimos: Autenticación API

Primero, agrego Spring Security al proyecto, en el pom.xml:

org.springframework.boot spring-boot-starter-security org.springframework.security spring-security-test test

public class Usuario implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String login;
private String contrasena;

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return List.of(new SimpleGrantedAuthority("ROLE_USER"));
}

@Override
public String getPassword() {
    return contrasena;
}

@Override
public String getUsername() {
    return login;
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return true;
}

}

public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
UserDetails findByLogin(String login);
}
@Service
public class AutenticacionService implements UserDetailsService {

@Autowired
private UsuarioRepository repository;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    return repository.findByLogin(username);
}

}

public class SecurityConfigurations {

@Bean

public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(csrf -> csrf.disable())
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.build();
}

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

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

}
Copia el código
Finalmente, deberá crear una clase Controller y un DTO para manejar las solicitudes de autenticación en la API:

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

@Autowired
private AuthenticationManager manager;

@PostMapping
public ResponseEntity iniciarSesion(@RequestBody @Valid DatosAutenticacion datos) {
    var token = new UsernamePasswordAuthenticationToken(datos.login(), datos.contrasena());
    var authenticaon = manager.authenticate(token);

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

}
Copia el código
public record DatosAutenticacion(String login, String contrasena) {
}
Copia el código
Para probar la autenticación, deberá insertar un registro de usuario en su base de datos, en la tabla de usuarios:

insert into usuarios values(1, 'jeimy.flores@voll.med',aMFOxteibQE

1 respuesta

Hola Yolima,

Parece que estás en el camino correcto para implementar la autenticación en tu API con Spring Security. Sin embargo, he notado que en tu inserción de usuario en la base de datos, la contraseña no está codificada. Esto es importante porque Spring Security espera que las contraseñas estén codificadas, generalmente con BCrypt, para poder compararlas correctamente durante el proceso de autenticación.

Aquí tienes un ejemplo de cómo podrías codificar la contraseña antes de insertarla en la base de datos:

@Autowired
private PasswordEncoder passwordEncoder;

public void crearUsuario() {
    String contrasenaCodificada = passwordEncoder.encode("tu_contrasena");
    Usuario usuario = new Usuario();
    usuario.setLogin("jeimy.flores@voll.med");
    usuario.setContrasena(contrasenaCodificada);
    repository.save(usuario);
}

Asegúrate de que la contraseña que insertes en la base de datos esté codificada de esta manera. Luego, cuando intentes autenticarte, Spring Security podrá comparar la contraseña ingresada con la codificada en la base de datos.

Espero que esto te ayude a resolver tu problema de autenticación. Si tienes más dudas, no dudes en preguntar.

Espero haber ayudado y buenos estudios!