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

@Entity
@Table(name = "usuarios")
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 void setLogin(String login) {
    this.login = login;
}

public void setContrasena(String contrasena) {
    this.contrasena = contrasena;
}

}
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);
}

}
@Configuration
@EnableWebSecurity
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();
}

}
@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());
    manager.authenticate(token);
    return ResponseEntity.ok().build();
}

}
public record DatosAutenticacion(String login, String contrasena) {
}
@Service
public class CrearUsuarioService {

@Autowired
private UsuarioRepository repository;

@Autowired
private PasswordEncoder passwordEncoder;

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

}

1 respuesta

Hola Alexis, espero que estés bien

Parece que estás trabajando en implementar la autenticación para tu API utilizando Spring Boot. A partir del código que compartiste, parece que ya tienes una buena estructura básica para manejar la autenticación. Aquí hay algunos puntos que podrías considerar o verificar para asegurarte de que todo esté funcionando correctamente:

  1. Codificación de Contraseña: Estás utilizando BCryptPasswordEncoder para codificar las contraseñas, lo cual es una buena práctica. Asegúrate de que las contraseñas estén siendo codificadas antes de almacenarlas en la base de datos, como lo haces en el servicio CrearUsuarioService.

  2. Autenticación: En el controlador AutenticacionController, estás utilizando UsernamePasswordAuthenticationToken para autenticar a los usuarios. Asegúrate de que los datos de autenticación (DatosAutenticacion) estén siendo enviados correctamente en el cuerpo de la solicitud POST a /login.

  3. Configuración de Seguridad: En SecurityConfigurations, has deshabilitado CSRF y configurado la política de sesión como STATELESS, lo cual es adecuado para APIs RESTful. Sin embargo, asegúrate de que las rutas que necesitan protección estén adecuadamente configuradas para requerir autenticación.

  4. Pruebas: Asegúrate de probar el flujo completo de autenticación. Esto incluye crear un usuario, codificar su contraseña, y luego intentar autenticarse con las credenciales correctas e incorrectas para verificar que todo funcione como se espera.

Un ejemplo práctico sería crear un usuario con el servicio CrearUsuarioService y luego intentar iniciar sesión con las credenciales de ese usuario. Si todo está configurado correctamente, deberías recibir una respuesta exitosa al autenticarte con las credenciales correctas.

Espero que estos consejos te sean útiles y te ayuden a completar tu implementación de autenticación. ¡Bons estudios!