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

Haz como yo hice

public record DatosAutenticacionUsuario(
String login,
String clave
) {
}

public record DatosJWTToken(String token) {
}

@Service
public class TokenService {

@Value("${api.security.secret}")
private String secret;

public String generarToken(Usuario usuario) {

    Algorithm algorithm = Algorithm.HMAC256(secret);

    return JWT.create()
            .withIssuer("api pacientes")
            .withSubject(usuario.getLogin())
            .sign(algorithm);
}

public String getSubject(String tokenJWT) {

    Algorithm algorithm = Algorithm.HMAC256(secret);

    return JWT.require(algorithm)
            .withIssuer("api pacientes")
            .build()
            .verify(tokenJWT)
            .getSubject();
}

}

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

@Autowired
private AuthenticationManager authenticationManager;

@Autowired
private TokenService tokenService;

@PostMapping
public ResponseEntity<DatosJWTToken> autenticarUsuario(
        @RequestBody @Valid DatosAutenticacionUsuario datos) {

    var authToken = new UsernamePasswordAuthenticationToken(
            datos.login(),
            datos.clave()
    );

    var autenticacion = authenticationManager.authenticate(authToken);

    var tokenJWT = tokenService.generarToken(
            (Usuario) autenticacion.getPrincipal()
    );

    return ResponseEntity.ok(new DatosJWTToken(tokenJWT));
}

}

@Entity
@Table(name = "usuarios")
public class Usuario implements UserDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String login;
private String clave;

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

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

@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) {
    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))
            .authorizeHttpRequests(req -> {
                req.requestMatchers(HttpMethod.POST, "/login").permitAll();
                req.anyRequest().authenticated();
            })
            .build();
}

@Bean
public AuthenticationManager authenticationManager(
        AuthenticationConfiguration configuration) throws Exception {

    return configuration.getAuthenticationManager();
}

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

}

1 respuesta

Hola David,

Gracias por compartir tu código con nosotros. Es muy bueno ver cómo vas poniendo en práctica lo que aprendes.

Te recomiendo que puedas interactuar con el resto de nuestros compañeros por nuestro Discord.

En virtud de que en Discord el alcance es mayor, la interacción es inmediata y llega a más compañeros, y el foro solo quedaría para esclarecer cualquier duda que puedas tener sobre el contenido de los cursos.

De esa manera, si quieres seguir compartiendo tus soluciones y proyectos, sea por el Discord — con certeza por ahí llegará a más personas.

¡Gracias nuevamente!

Saludos,

Si este post te ayudó, por favor, marca como solucionado ✓. ¡Continúa con tus estudios!