Commit d5bf03e2 by Rubén Ramírez

feat: [TestRecursosController]: Hecho el test para la función en el controlador…

feat: [TestRecursosController]: Hecho el test para la función en el controlador para crear un recurso.
Corregidas erratas
parent b7e6edc7
......@@ -32,14 +32,19 @@ public class Usuario {
@Column(nullable = false)
private String contrasenia;
@NotBlank
@Column(nullable = false)
private String rol;
@OneToOne(mappedBy = "usuario", cascade = CascadeType.ALL)
private Repositorio repositorio;
public Usuario(String email, String nombreUsuario, String contrasenia) {
public Usuario(String email, String nombreUsuario, String contrasenia, String rol) {
this.email = email;
this.nombreUsuario = nombreUsuario;
this.contrasenia = contrasenia;
this.rol = rol;
this.repositorio = new Repositorio(this);
}
......
......@@ -12,9 +12,11 @@ public class Mapper {
}
public Usuario entity(DTOUsuario dtoUsuario) {
return new Usuario(dtoUsuario.getEmail(), dtoUsuario.getNombreUsuario(), dtoUsuario.getContrasenia());
String rol = dtoUsuario.getEmail().equalsIgnoreCase("admin@example.com") ? "ADMIN" : "USUARIO_REGISTRADO";
return new Usuario(dtoUsuario.getEmail(), dtoUsuario.getNombreUsuario(), dtoUsuario.getContrasenia(), rol);
}
public DTORecurso dto(Recurso recurso) {
return new DTORecurso(recurso.getId(), recurso.getTitulo(), recurso.getDescripcion(), recurso.getFechaPublicacion(), recurso.getAutor()
);
......
......@@ -8,12 +8,14 @@ import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
public class JwtFilter extends OncePerRequestFilter {
......@@ -30,7 +32,7 @@ public class JwtFilter extends OncePerRequestFilter {
String token = request.getHeader("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
chain.doFilter(request, response); // Permitir acceso a rutas públicas
chain.doFilter(request, response);
return;
}
......@@ -40,9 +42,15 @@ public class JwtFilter extends OncePerRequestFilter {
Claims claims = jwtUtil.decodeJWT(token);
request.setAttribute("claims", claims);
User userDetails = new User(claims.getSubject(), "", Collections.emptyList());
// Extraemos el rol del token y lo convertimos en GrantedAuthority
String rol = (String) claims.get("rol");
List<SimpleGrantedAuthority> authorities = List.of(new SimpleGrantedAuthority("ROLE_" + rol));
// Creamos un usuario con ese rol
User userDetails = new User(claims.getSubject(), "", authorities);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (TokenExpirado | TokenInvalido e) {
......
......@@ -23,7 +23,6 @@ public class ServicioSeguridad {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(csrf -> csrf.disable())
.sessionManagement(session -> session.disable())
......@@ -31,6 +30,7 @@ public class ServicioSeguridad {
.authorizeHttpRequests(request -> request
.requestMatchers(HttpMethod.POST, "/usuarios/{email}").permitAll()
.requestMatchers(HttpMethod.POST, "/usuarios/").permitAll()
.requestMatchers(HttpMethod.POST, "/recursos/").hasAuthority("ROLE_ADMIN") // <--- Aquí usamos ROLE_ADMIN
.anyRequest().authenticated()
)
.addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class)
......@@ -38,6 +38,7 @@ public class ServicioSeguridad {
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
......
......@@ -46,6 +46,14 @@ public class ServicioUsuarios {
*/
public void crearUsuario(@Valid Usuario usuario) {
usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia()));
// Si el email es del admin, asignarle el rol ADMIN
if (usuario.getEmail().equalsIgnoreCase("admin@example.com")) {
usuario.setRol("ADMIN");
} else {
usuario.setRol("USUARIO_REGISTRADO");
}
repositorioUsuario.guardar(usuario);
}
......@@ -64,14 +72,9 @@ public class ServicioUsuarios {
if (!passwordEncoder.matches(contrasenia, usuario.get().getContrasenia())) {
return null;
}
String rol = "USUARIO_REGISTRADO";
if (email.equals(admin.getEmail())) {
if (!passwordEncoder.matches(contrasenia, passwordEncoder.encode("adminpassword"))) {
return null;
}
rol = "ADMIN";
}
// Recuperamos el rol del usuario desde la base de datos
String rol = usuario.get().getRol();
// Datos adicionales en el token (claims)
Map<String, Object> claims = new HashMap<>();
......@@ -82,7 +85,6 @@ public class ServicioUsuarios {
// Generamos el token JWT
String token = jwtUtil.generateToken(claims, usuario.get().getEmail());
return new DTOLoginRespuesta(token, usuario.get().getEmail(), usuario.get().getNombreUsuario());
}
......
spring.application.name=MangAfginity
spring.application.name=MangAffinity
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
jwt.secret=V9++ZyZHKcKKzVvAWKU5EL8/QDTDVOf/LTv+r8dUbQg=
\ No newline at end of file
package com.ujaen.tfg.mangaffinity.rest;
import com.ujaen.tfg.mangaffinity.MangAffinityApplication;
import com.ujaen.tfg.mangaffinity.config.JpaTestConfig;
import com.ujaen.tfg.mangaffinity.entidades.Recurso;
import com.ujaen.tfg.mangaffinity.rest.DTO.DTOLoginRespuesta;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.http.*;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import java.time.LocalDate;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(classes = {MangAffinityApplication.class, JpaTestConfig.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TestRecursosController {
@LocalServerPort
int localPort;
@Autowired
private TestRestTemplate restTemplate;
@Test
@DirtiesContext
void testCrearRecurso() {
// Crear usuario admin en la base de datos con el rol correcto
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "admin@example.com",
"nombreUsuario", "admin",
"contrasenia", "adminpassword"
), Void.class);
// Autenticamos al usuario admin para obtener su token
var authResponse = restTemplate.postForEntity("/usuarios/admin@example.com", Map.of(
"clave", "adminpassword"
), DTOLoginRespuesta.class);
assertThat(authResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
String token = "Bearer " + authResponse.getBody().getToken();
// Intentamos crear un recurso sin autenticación (debe fallar)
Recurso nuevoRecurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba");
var respuestaNoAutenticado = restTemplate.postForEntity("/recursos/", nuevoRecurso, Void.class);
assertThat(respuestaNoAutenticado.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED);
// Creamos el recurso correctamente con autenticación de admin
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(nuevoRecurso, headers);
var respuestaAdmin = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaAdmin.getStatusCode()).isEqualTo(HttpStatus.CREATED);
}
}
......@@ -32,12 +32,13 @@ public class TestServicioUsuarios {
@Test
@DirtiesContext
void testCrearSocio(){
var usuario1 = new Usuario("pedro@gmail.com", "Pedro", "pedrito"); // Se pasa en texto plano
void testCrearSocio() {
var usuario1 = new Usuario("pedro@gmail.com", "Pedro", "pedrito", "USUARIO_REGISTRADO"); // Se agrega el rol
servicioUsuarios.crearUsuario(usuario1);
assertThatThrownBy(() -> servicioUsuarios.crearUsuario(usuario1)).isInstanceOf(UsuarioYaRegistrado.class);
}
@Test
@DirtiesContext
void testAutenticarUsuario() {
......@@ -52,10 +53,10 @@ public class TestServicioUsuarios {
assertThat(servicioUsuarios.autenticarUsuario(emailExistente, contraseniaIncorrecta)).isNull();
// Caso 3: Usuario con email y contraseña correctos
var usuario2 = new Usuario("pedra@gmail.com", "Pedra", "pedrito"); // Se pasa en texto plano
var usuario2 = new Usuario("pedra@gmail.com", "Pedra", "pedrito", "USUARIO_REGISTRADO"); // Se agrega el rol
servicioUsuarios.crearUsuario(usuario2);
Usuario usuarioGuardado = servicioUsuarios.buscaUsuario("pedro@gmail.com");
Usuario usuarioGuardado = servicioUsuarios.buscaUsuario("pedra@gmail.com");
assertThat(usuarioGuardado).isNotNull();
DTOLoginRespuesta respuestaValida = servicioUsuarios.autenticarUsuario(usuario2.getEmail(), "pedrito");
......
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