Primero, agrego Spring Security al proyecto, en el pom.xml:
org.springframework.boot spring-boot-starter-security org.springframework.security spring-security-test testpublic 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