Commit 57d35b81 by Rubén Ramírez

feat: [ServicioUsuario]: Implementado el método de inicio de sesión con jwt

parent 18a1b791
......@@ -8,6 +8,7 @@ import jakarta.validation.constraints.NotBlank;
@Entity
@Table(name = "usuarios")
@Getter
@Setter
@NoArgsConstructor
public class Usuario {
......
......@@ -5,8 +5,11 @@ import com.ujaen.tfg.mangaffinity.excepciones.UsuarioYaRegistrado;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
@Repository
@Transactional
public class RepositorioUsuario {
......@@ -24,4 +27,9 @@ public class RepositorioUsuario {
em.persist(usuario);
}
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public Optional<Usuario> findByEmail(String email) {
return Optional.ofNullable(em.find(Usuario.class, email));
}
}
package com.ujaen.tfg.mangaffinity.rest.DTO;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class DTOLoginRespuesta {
private String token;
private String email;
private String nombreUsuario;
}
\ No newline at end of file
......@@ -5,9 +5,11 @@ import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class DTOUsuario {
......
......@@ -50,6 +50,12 @@ public class JwtUtil {
return extractClaim(token, Claims::getExpiration);
}
public String extractRoles(String token) {
Claims claims = extractAllClaims(token);
return (String) claims.get("roles"); // Extrae el rol desde los claims
}
/**
* Extrae un claim específico del token.
*
......
......@@ -2,19 +2,41 @@ package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.Usuario;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioUsuario;
import com.ujaen.tfg.mangaffinity.rest.DTO.DTOLoginRespuesta;
import com.ujaen.tfg.mangaffinity.rest.DTO.DTOUsuario;
import com.ujaen.tfg.mangaffinity.seguridad.JwtUtil;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Service
public class ServicioUsuarios {
@Autowired
RepositorioUsuario repositorioUsuario;
private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
@Autowired
private static final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
@Autowired
private JwtUtil jwtUtil;
private static final Usuario admin;
static {
// Se crea el admin con la contraseña encriptada
admin = new Usuario();
admin.setEmail("admin@example.com");
admin.setNombreUsuario("admin");
admin.setContrasenia(passwordEncoder.encode("adminpassword")); // Contraseña encriptada
}
/**
* Función para crear un Socio en la estructura
* @param usuario usuario que se va a añadir
......@@ -23,4 +45,35 @@ public class ServicioUsuarios {
usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia()));
repositorioUsuario.guardar(usuario);
}
/**
* Autentica a un usuario y genera un token JWT si las credenciales son correctas.
* @param email Email del usuario
* @param contrasenia Contraseña en texto plano
* @return DTOLoginRespuesta con el token si es válido, o null si falla
*/
public DTOLoginRespuesta autenticarUsuario(String email, String contrasenia) {
Optional<Usuario> usuario = repositorioUsuario.findByEmail(email);
if (usuario.isEmpty() || !passwordEncoder.matches(contrasenia, usuario.get().getContrasenia())) {
// Si el usuario no existe o la contraseña no es válida
return null;
}
// Verificamos si el usuario es el "admin"
String rol = (email.equals(admin.getEmail())) ? "ADMIN" : "USUARIO_REGISTRADO";
// Datos adicionales en el token (claims)
Map<String, Object> claims = new HashMap<>();
claims.put("email", usuario.get().getEmail());
claims.put("nombreUsuario", usuario.get().getNombreUsuario());
claims.put("rol", rol);
// Generamos el token JWT
String token = jwtUtil.generateToken(claims, usuario.get().getEmail());
return new DTOLoginRespuesta(token, usuario.get().getEmail(), usuario.get().getContrasenia());
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment