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 { ...@@ -32,14 +32,19 @@ public class Usuario {
@Column(nullable = false) @Column(nullable = false)
private String contrasenia; private String contrasenia;
@NotBlank
@Column(nullable = false)
private String rol;
@OneToOne(mappedBy = "usuario", cascade = CascadeType.ALL) @OneToOne(mappedBy = "usuario", cascade = CascadeType.ALL)
private Repositorio repositorio; 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.email = email;
this.nombreUsuario = nombreUsuario; this.nombreUsuario = nombreUsuario;
this.contrasenia = contrasenia; this.contrasenia = contrasenia;
this.rol = rol;
this.repositorio = new Repositorio(this); this.repositorio = new Repositorio(this);
} }
......
...@@ -12,9 +12,11 @@ public class Mapper { ...@@ -12,9 +12,11 @@ public class Mapper {
} }
public Usuario entity(DTOUsuario dtoUsuario) { 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) { public DTORecurso dto(Recurso recurso) {
return new DTORecurso(recurso.getId(), recurso.getTitulo(), recurso.getDescripcion(), recurso.getFechaPublicacion(), recurso.getAutor() return new DTORecurso(recurso.getId(), recurso.getTitulo(), recurso.getDescripcion(), recurso.getFechaPublicacion(), recurso.getAutor()
); );
......
...@@ -8,12 +8,14 @@ import jakarta.servlet.ServletException; ...@@ -8,12 +8,14 @@ import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 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.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.User;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List;
public class JwtFilter extends OncePerRequestFilter { public class JwtFilter extends OncePerRequestFilter {
...@@ -30,7 +32,7 @@ public class JwtFilter extends OncePerRequestFilter { ...@@ -30,7 +32,7 @@ public class JwtFilter extends OncePerRequestFilter {
String token = request.getHeader("Authorization"); String token = request.getHeader("Authorization");
if (token == null || !token.startsWith("Bearer ")) { if (token == null || !token.startsWith("Bearer ")) {
chain.doFilter(request, response); // Permitir acceso a rutas públicas chain.doFilter(request, response);
return; return;
} }
...@@ -40,9 +42,15 @@ public class JwtFilter extends OncePerRequestFilter { ...@@ -40,9 +42,15 @@ public class JwtFilter extends OncePerRequestFilter {
Claims claims = jwtUtil.decodeJWT(token); Claims claims = jwtUtil.decodeJWT(token);
request.setAttribute("claims", claims); 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 = UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication); SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (TokenExpirado | TokenInvalido e) { } catch (TokenExpirado | TokenInvalido e) {
......
...@@ -23,7 +23,6 @@ public class ServicioSeguridad { ...@@ -23,7 +23,6 @@ public class ServicioSeguridad {
@Bean @Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http return http
.csrf(csrf -> csrf.disable()) .csrf(csrf -> csrf.disable())
.sessionManagement(session -> session.disable()) .sessionManagement(session -> session.disable())
...@@ -31,6 +30,7 @@ public class ServicioSeguridad { ...@@ -31,6 +30,7 @@ public class ServicioSeguridad {
.authorizeHttpRequests(request -> request .authorizeHttpRequests(request -> request
.requestMatchers(HttpMethod.POST, "/usuarios/{email}").permitAll() .requestMatchers(HttpMethod.POST, "/usuarios/{email}").permitAll()
.requestMatchers(HttpMethod.POST, "/usuarios/").permitAll() .requestMatchers(HttpMethod.POST, "/usuarios/").permitAll()
.requestMatchers(HttpMethod.POST, "/recursos/").hasAuthority("ROLE_ADMIN") // <--- Aquí usamos ROLE_ADMIN
.anyRequest().authenticated() .anyRequest().authenticated()
) )
.addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class)
...@@ -38,6 +38,7 @@ public class ServicioSeguridad { ...@@ -38,6 +38,7 @@ public class ServicioSeguridad {
} }
@Bean @Bean
public PasswordEncoder passwordEncoder() { public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); return new BCryptPasswordEncoder();
......
...@@ -46,6 +46,14 @@ public class ServicioUsuarios { ...@@ -46,6 +46,14 @@ public class ServicioUsuarios {
*/ */
public void crearUsuario(@Valid Usuario usuario) { public void crearUsuario(@Valid Usuario usuario) {
usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia())); 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); repositorioUsuario.guardar(usuario);
} }
...@@ -64,14 +72,9 @@ public class ServicioUsuarios { ...@@ -64,14 +72,9 @@ public class ServicioUsuarios {
if (!passwordEncoder.matches(contrasenia, usuario.get().getContrasenia())) { if (!passwordEncoder.matches(contrasenia, usuario.get().getContrasenia())) {
return null; return null;
} }
String rol = "USUARIO_REGISTRADO";
if (email.equals(admin.getEmail())) { // Recuperamos el rol del usuario desde la base de datos
if (!passwordEncoder.matches(contrasenia, passwordEncoder.encode("adminpassword"))) { String rol = usuario.get().getRol();
return null;
}
rol = "ADMIN";
}
// Datos adicionales en el token (claims) // Datos adicionales en el token (claims)
Map<String, Object> claims = new HashMap<>(); Map<String, Object> claims = new HashMap<>();
...@@ -82,7 +85,6 @@ public class ServicioUsuarios { ...@@ -82,7 +85,6 @@ public class ServicioUsuarios {
// Generamos el token JWT // Generamos el token JWT
String token = jwtUtil.generateToken(claims, usuario.get().getEmail()); String token = jwtUtil.generateToken(claims, usuario.get().getEmail());
return new DTOLoginRespuesta(token, usuario.get().getEmail(), usuario.get().getNombreUsuario()); 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 spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
jwt.secret=V9++ZyZHKcKKzVvAWKU5EL8/QDTDVOf/LTv+r8dUbQg= 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 { ...@@ -32,12 +32,13 @@ public class TestServicioUsuarios {
@Test @Test
@DirtiesContext @DirtiesContext
void testCrearSocio(){ void testCrearSocio() {
var usuario1 = new Usuario("pedro@gmail.com", "Pedro", "pedrito"); // Se pasa en texto plano var usuario1 = new Usuario("pedro@gmail.com", "Pedro", "pedrito", "USUARIO_REGISTRADO"); // Se agrega el rol
servicioUsuarios.crearUsuario(usuario1); servicioUsuarios.crearUsuario(usuario1);
assertThatThrownBy(() -> servicioUsuarios.crearUsuario(usuario1)).isInstanceOf(UsuarioYaRegistrado.class); assertThatThrownBy(() -> servicioUsuarios.crearUsuario(usuario1)).isInstanceOf(UsuarioYaRegistrado.class);
} }
@Test @Test
@DirtiesContext @DirtiesContext
void testAutenticarUsuario() { void testAutenticarUsuario() {
...@@ -52,10 +53,10 @@ public class TestServicioUsuarios { ...@@ -52,10 +53,10 @@ public class TestServicioUsuarios {
assertThat(servicioUsuarios.autenticarUsuario(emailExistente, contraseniaIncorrecta)).isNull(); assertThat(servicioUsuarios.autenticarUsuario(emailExistente, contraseniaIncorrecta)).isNull();
// Caso 3: Usuario con email y contraseña correctos // 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); servicioUsuarios.crearUsuario(usuario2);
Usuario usuarioGuardado = servicioUsuarios.buscaUsuario("pedro@gmail.com"); Usuario usuarioGuardado = servicioUsuarios.buscaUsuario("pedra@gmail.com");
assertThat(usuarioGuardado).isNotNull(); assertThat(usuarioGuardado).isNotNull();
DTOLoginRespuesta respuestaValida = servicioUsuarios.autenticarUsuario(usuario2.getEmail(), "pedrito"); 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