Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Rubén Ramírez
/
MangAffinity
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
57d35b81
authored
Feb 20, 2025
by
Rubén Ramírez
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
feat: [ServicioUsuario]: Implementado el método de inicio de sesión con jwt
parent
18a1b791
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
85 additions
and
1 deletions
src/main/java/com/ujaen/tfg/mangaffinity/entidades/Usuario.java
src/main/java/com/ujaen/tfg/mangaffinity/repositorios/RepositorioUsuario.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/DTO/DTOLoginRespuesta.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/DTO/DTOUsuario.java
src/main/java/com/ujaen/tfg/mangaffinity/seguridad/JwtUtil.java
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioUsuarios.java
src/main/java/com/ujaen/tfg/mangaffinity/entidades/Usuario.java
View file @
57d35b81
...
...
@@ -8,6 +8,7 @@ import jakarta.validation.constraints.NotBlank;
@Entity
@Table
(
name
=
"usuarios"
)
@Getter
@Setter
@NoArgsConstructor
public
class
Usuario
{
...
...
src/main/java/com/ujaen/tfg/mangaffinity/repositorios/RepositorioUsuario.java
View file @
57d35b81
...
...
@@ -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
));
}
}
src/main/java/com/ujaen/tfg/mangaffinity/rest/DTO/DTOLoginRespuesta.java
0 → 100644
View file @
57d35b81
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
src/main/java/com/ujaen/tfg/mangaffinity/rest/DTO/DTOUsuario.java
View file @
57d35b81
...
...
@@ -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
{
...
...
src/main/java/com/ujaen/tfg/mangaffinity/seguridad/JwtUtil.java
View file @
57d35b81
...
...
@@ -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.
*
...
...
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioUsuarios.java
View file @
57d35b81
...
...
@@ -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
());
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment