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; ...@@ -8,6 +8,7 @@ import jakarta.validation.constraints.NotBlank;
@Entity @Entity
@Table(name = "usuarios") @Table(name = "usuarios")
@Getter @Getter
@Setter
@NoArgsConstructor @NoArgsConstructor
public class Usuario { public class Usuario {
......
...@@ -5,8 +5,11 @@ import com.ujaen.tfg.mangaffinity.excepciones.UsuarioYaRegistrado; ...@@ -5,8 +5,11 @@ import com.ujaen.tfg.mangaffinity.excepciones.UsuarioYaRegistrado;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
@Repository @Repository
@Transactional @Transactional
public class RepositorioUsuario { public class RepositorioUsuario {
...@@ -24,4 +27,9 @@ public class RepositorioUsuario { ...@@ -24,4 +27,9 @@ public class RepositorioUsuario {
em.persist(usuario); 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; ...@@ -5,9 +5,11 @@ import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter @Getter
@Setter
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class DTOUsuario { public class DTOUsuario {
......
...@@ -50,6 +50,12 @@ public class JwtUtil { ...@@ -50,6 +50,12 @@ public class JwtUtil {
return extractClaim(token, Claims::getExpiration); 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. * Extrae un claim específico del token.
* *
......
...@@ -2,19 +2,41 @@ package com.ujaen.tfg.mangaffinity.servicios; ...@@ -2,19 +2,41 @@ package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.Usuario; import com.ujaen.tfg.mangaffinity.entidades.Usuario;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioUsuario; 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 jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Service @Service
public class ServicioUsuarios { public class ServicioUsuarios {
@Autowired @Autowired
RepositorioUsuario repositorioUsuario; 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 * Función para crear un Socio en la estructura
* @param usuario usuario que se va a añadir * @param usuario usuario que se va a añadir
...@@ -23,4 +45,35 @@ public class ServicioUsuarios { ...@@ -23,4 +45,35 @@ public class ServicioUsuarios {
usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia())); usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia()));
repositorioUsuario.guardar(usuario); 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