Modificacioens

parent 398a6e91
......@@ -85,10 +85,6 @@
<version>2.10.9.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
......
......@@ -4,7 +4,6 @@ import com.carpooling.carpoolingaoraha.excepciones.ReservaNoRegistrada;
import com.carpooling.carpoolingaoraha.excepciones.SolicitudYaExistente;
import com.carpooling.carpoolingaoraha.excepciones.ViajeNoRegistrado;
import com.carpooling.carpoolingaoraha.services.ServicioCarPooling;
import com.carpooling.carpoolingaoraha.utils.CodificadorPassword;
import com.carpooling.carpoolingaoraha.utils.ExprReg;
import jakarta.persistence.*;
import org.antlr.v4.runtime.misc.NotNull;
......@@ -91,7 +90,7 @@ public class Usuario {
this.DNI = DNI;
this.telefono = telefono;
this.email = email;
this.claveAcceso = (claveAcceso != null ? CodificadorPassword.codificar(claveAcceso) : null);
this.claveAcceso = claveAcceso;
this.puntuacion = new ArrayList<>();
this.rol = rol;
this.viajesOfertados = new ArrayList<>();
......@@ -387,8 +386,4 @@ public class Usuario {
this.historicoSolicitudes = historicoSolicitudes;
}
public boolean claveValida(String clave) {
return CodificadorPassword.igual(clave, this.claveAcceso);
//return this.clave.equals(clave);
}
}
......@@ -30,7 +30,7 @@ public class ControladorREST {
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<String> handlerViolacionRestricciones(ConstraintViolationException ex){
return ResponseEntity.badRequest().body(ex.getMessage());
return ResponseEntity.badRequest().body(ex.getMessage());
}
/**
......@@ -150,7 +150,7 @@ public class ControladorREST {
Optional<Viaje> viajeExistente = servicioCarPooling.verViaje(id);
return viajeExistente.map(viaje -> {
if (datosViaje.containsKey("nuevoOrigen")) {
viaje.setOrigen((String) datosViaje.get("nuevoOrigen"));
viaje.setOrigen((String) datosViaje.get("nuevoOrigen"));
}
if (datosViaje.containsKey("nuevoDestino")) {
viaje.setDestino((String) datosViaje.get("nuevoDestino"));
......
package com.carpooling.carpoolingaoraha.seguridad;
import com.carpooling.carpoolingaoraha.entidades.Usuario;
import com.carpooling.carpoolingaoraha.services.ServicioCarPooling;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class ServicioDatosCliente implements UserDetailsService {
@Autowired
ServicioCarPooling servicioCarPooling;
@Override
public UserDetails loadUserByUsername(String dni) throws UsernameNotFoundException {
Usuario cliente = servicioCarPooling.verUsuario(dni)
.orElseThrow(() -> new UsernameNotFoundException(""));
return User.withUsername(cliente.getDNI())
.roles("USUARIO").password(cliente.getClaveAcceso())
.build();
}
}
package com.carpooling.carpoolingaoraha.seguridad;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager;
public class ServicioSeguridadCarpooling {
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.httpBasic(httpBasic -> httpBasic.realmName("carpooling"))
.csrf(csrf -> csrf.disable())
.sessionManagement(session -> session.disable())
.authorizeHttpRequests(request -> request.requestMatchers(HttpMethod.POST, "/carpooling/usuarios")
.permitAll());
return httpSecurity.build();
}
}
......@@ -125,13 +125,6 @@ public class ServicioCarPooling {
return usuarioLogin;
}
public Optional<Usuario> login(@NotBlank String dni, @NotBlank String clave) {
Optional<Usuario> clienteLogin = repositorioUsuario.buscar(dni)
.filter((cliente)->cliente.claveValida(clave));
return clienteLogin;
}
@Transactional
public Optional<Viaje> verViaje(@NotBlank int id) {
Optional<Viaje> viaje = repositorioViajes.buscar(id);
......@@ -236,7 +229,7 @@ public class ServicioCarPooling {
return reservaActual;
} else {
throw new ReservaNoRegistrada();
throw new ReservaNoRegistrada();
}
}
......@@ -272,4 +265,12 @@ public class ServicioCarPooling {
return reservas;
}
public Optional<Usuario> login(@NotBlank String dni, @NotBlank String clave) {
Optional<Usuario> clienteLogin = repositorioUsuario.buscar(dni)
.filter((cliente)->cliente.equals(clave));
return clienteLogin;
}
}
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.carpooling.carpoolingaoraha.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author ajrueda
*/
public class CachedBCryptPasswordEncoder extends BCryptPasswordEncoder {
static Map<String, CharSequence> cache = new HashMap<>();
public CachedBCryptPasswordEncoder() {
super();
}
public CachedBCryptPasswordEncoder(int strength) {
super(strength);
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
CharSequence cachedMatch = cache.get(encodedPassword);
if (cachedMatch != null && cachedMatch.equals(rawPassword)) {
return true;
}
boolean result = super.matches(rawPassword, encodedPassword);
if (result == true) {
cache.put(encodedPassword, rawPassword);
}
return result;
}
}
package com.carpooling.carpoolingaoraha.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* Codificador sencillo para contraseñas basado en Md5 (no seguro)
* @author ajrueda
*/
public class CodificadorPassword {
static BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
private CodificadorPassword() {
}
public static String codificar(String cadena) {
return encoder.encode(cadena);
}
public static boolean igual(String password, String passwordCodificado) {
return encoder.matches(password, passwordCodificado);
}
}
......@@ -19,10 +19,13 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import java.text.SimpleDateFormat;
import java.util.*;
@SpringBootTest(classes = com.carpooling.carpoolingaoraha.CarPoolingAorAhaApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles(profiles = {"test"})
public class ControladorRESTTEST {
......@@ -30,38 +33,28 @@ public class ControladorRESTTEST {
int localPort;
@Autowired
MappingJackson2HttpMessageConverter springBootJacksonConverter;
MappingJackson2HttpMessageConverter springBoot;
TestRestTemplate restTemplate;
@PostConstruct
void crearRestTemplate() {
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder()
.rootUri("http://localhost:" + localPort + "/carpooling")
.additionalMessageConverters(List.of(springBootJacksonConverter));
.additionalMessageConverters(List.of(springBoot));
restTemplate = new TestRestTemplate(restTemplateBuilder);
}
@Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void altaUsuario(){
Date fecha = new Date(2000, 12, 1);
DTOUsuario usuario = new DTOUsuario("Fernando", "Alonso Diaz",fecha, "78062640S", 670988953, "hola@gmail.com", "clave", Usuario.Rol.CONDUCTOR);
DTOUsuario usuario = new DTOUsuario("Fernando", "Alonso Diaz",fecha, "78062640S", 670988953, "hola@gmail.com", "1234", Usuario.Rol.CONDUCTOR);
ResponseEntity<DTOUsuario> respuesta = restTemplate.postForEntity
(
"/usuarios", usuario, DTOUsuario.class
);
Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
ResponseEntity<DTOUsuario> respuestaLogin = restTemplate
.withBasicAuth(usuario.DNI(), usuario.claveAcceso())
.getForEntity(
"/usuarios/{dni}",
DTOUsuario.class,
usuario.DNI()
"/usuarios", usuario, DTOUsuario.class
);
Assertions.assertThat(respuestaLogin.getStatusCode()).isEqualTo(HttpStatus.OK);
Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
}
@Test
......@@ -356,7 +349,7 @@ public class ControladorRESTTEST {
Assertions.assertThat(respuestaA.getStatusCode()).isEqualTo(HttpStatus.OK);
}
@Test
public void solicitarViaje() {
public void crearSolicitud() {
Date fecha = new Date(2000, 12, 1);
DTOUsuario usuario = new DTOUsuario("Fernando", "Alonso Diaz",fecha, "78162640S", 670988953, "hola@gmail.com", "1234", Usuario.Rol.CONDUCTOR);
ResponseEntity<DTOUsuario> respuesta = restTemplate.postForEntity
......
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