Se realizan modicaciones en de seguridad en JwtUserDetailsService y…

Se realizan modicaciones en de seguridad en JwtUserDetailsService y SecurityConfig para tener control de las apis, además se modifica el ModelUzyTavActProy
parent 28512ed1
......@@ -6,6 +6,7 @@ import ec.edu.espe.movilidad.MovilidadWS.Exceptions.InvalidArgumentException;
import ec.edu.espe.movilidad.MovilidadWS.Exceptions.ResourceNotFoundException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
......@@ -117,6 +118,10 @@ public class GlobalExceptionHandler {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error de entrada/salida: " + ex.getMessage());
}
@ExceptionHandler(UsernameNotFoundException.class)
public ResponseEntity<String> handleUsernameNotFoundException(UsernameNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Usuario no encontrado");
}
@ExceptionHandler(DuplicateStateException.class)
public ResponseEntity<String> handleDuplicateStateException(DuplicateStateException ex) {
return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
......
package ec.edu.espe.movilidad.MovilidadWS.Mapper.Components_Class;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTavDepCenProy;
import ec.edu.espe.movilidad.MovilidadWS.Model.ModelUzyTavDepCenProy;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
@Component
public class UzyTavDepCenProyMapper {
private final ModelMapper modelMapper;
public UzyTavDepCenProyMapper(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
}
public DtoUzyTavDepCenProy entityToDto(ModelUzyTavDepCenProy entity) {
return modelMapper.map(entity, DtoUzyTavDepCenProy.class);
}
public ModelUzyTavDepCenProy dtoToEntity(DtoUzyTavDepCenProy dto) {
return modelMapper.map(dto, ModelUzyTavDepCenProy.class);
}
public List<DtoUzyTavDepCenProy> entitiesToDtos(List<ModelUzyTavDepCenProy> entities) {
return entities.stream()
.map(this::entityToDto)
.collect(Collectors.toList());
}
}
......@@ -39,6 +39,6 @@ public class ModelUzyTavActProy {
private ModelUzyTavProyec uzytavproyec;
//RELACIÓN CON ModelUzyTavDetActproy- TABLA PADRE
@JsonIgnore
@OneToMany(mappedBy = "uzytavactproy")
@OneToMany(mappedBy = "uzytavactproy", cascade = CascadeType.ALL)
private Set<ModelUzyTavDetActproy> uzytavdetactproys = new LinkedHashSet<>();
}
......@@ -11,6 +11,8 @@ import javax.validation.constraints.Size;
public class ModelUzyTavDepCenProy {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "uzytavdepcenproy_seq")
@SequenceGenerator(name = "uzytavdepcenproy_seq", sequenceName = "SEQ_UZYTAVDEPCENPROY", allocationSize = 1)
@Column(name = "uzytavdepcenproy_id")
private Long uzytavdepcenproy_id;
......
......@@ -7,13 +7,17 @@ import ec.edu.espe.movilidad.MovilidadWS.Mapper.Components_Class.UzyTPerfilMappe
import ec.edu.espe.movilidad.MovilidadWS.Model.ModelUzyTPerfil;
import ec.edu.espe.movilidad.MovilidadWS.Model.ModelUzyTUsuario;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
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;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Service
......@@ -35,12 +39,21 @@ public class JwtUserDetailsService implements UserDetailsService {
if (user == null) {
throw new UsernameNotFoundException("Usuario no encontrado");
}
List<GrantedAuthority> authorities = new ArrayList<>();
for (ModelUzyTPerfil perfil : user.getUzytperfils()) {
// Aquí puedes mapear tus roles o permisos a objetos GrantedAuthority
String roleName = "ROLE_" + perfil.getUzytperfil_nombre();
authorities.add(new SimpleGrantedAuthority(roleName));
return User
.withUsername(user.getUzytusuario_email_institucional())
.password("{noop}") // Cualquier contraseña, solo es para q no se vaya null
.roles("USER") // Roles
.build();
// Imprimir los roles en la consola
System.out.println("Rol asignado: " + roleName);
// Puedes agregar más lógica para manejar permisos específicos si es necesario
}
return new User(
user.getUzytusuario_email_institucional(),
"{noop}",
authorities
);
}
public DtoUserLogeado getUserInfoByUsername(String username) {
......
......@@ -34,8 +34,9 @@ public class SecurityConfig {
.httpBasic().authenticationEntryPoint(jwtEntryPoint)
.and()
.authorizeRequests()
// .antMatchers("/api/v1.0/**").authenticated()
.antMatchers("/api/v1.0/**").permitAll()
.antMatchers("/api/v2.0/convoca/**").authenticated()
// .antMatchers("/api/v1.0/**").hasRole("Administrador del Sistema") // Asignar API a rol ADMIN
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
......
......@@ -198,9 +198,8 @@ public class ServiceUzyTavConvoca implements IServiceUzyTavConvoca{
@Override
public DtoUzyTavConvoca guardar(DtoUzyTavConvoca dtoUzyTavConvoca) {
boolean active = daoUzyTavConvoca.existsActive();
boolean inactive = daoUzyTavConvoca.existsInactive();
if (active || inactive) {
if (active ) {
throw new DuplicateStateException("No se puede guardar el registro debido a que ya existe un registro con estado 'A' o 'I'");
}
try {
......
package ec.edu.espe.movilidad.MovilidadWS.Service.UzyTavDepCenProy;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTavDepCenProy;
import java.util.List;
public interface IServiceUzyTavDepCenProy {
DtoUzyTavDepCenProy ListarPorID(Long id);
List<DtoUzyTavDepCenProy> ListarRegistros();
DtoUzyTavDepCenProy guardar(DtoUzyTavDepCenProy dtoUzyTavDepCenProy);
DtoUzyTavDepCenProy editar(Long id, DtoUzyTavDepCenProy dtoUzyTavDepCenProy);
boolean eliminar(Long id);
}
package ec.edu.espe.movilidad.MovilidadWS.Service.UzyTavDepCenProy;
import ec.edu.espe.movilidad.MovilidadWS.Dao.DaoUzyTavDepCenProy;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTavDepCenProy;
import ec.edu.espe.movilidad.MovilidadWS.Exceptions.ResourceNotFoundException;
import ec.edu.espe.movilidad.MovilidadWS.Mapper.Components_Class.UzyTavDepCenProyMapper;
import ec.edu.espe.movilidad.MovilidadWS.Model.ModelUzyTavDepCenProy;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ServiceUzyTavDepCenProy implements IServiceUzyTavDepCenProy{
private final DaoUzyTavDepCenProy daoUzyTavDepCenProy;
private final UzyTavDepCenProyMapper mapper;
public ServiceUzyTavDepCenProy(DaoUzyTavDepCenProy daoUzyTavDepCenProy, UzyTavDepCenProyMapper mapper) {
this.daoUzyTavDepCenProy = daoUzyTavDepCenProy;
this.mapper = mapper;
}
@Override
public DtoUzyTavDepCenProy ListarPorID(Long id) {
if (id <= 0) {
throw new IllegalArgumentException("El parámetro 'id' debe ser un valor positivo.");
}
try {
ModelUzyTavDepCenProy entity = daoUzyTavDepCenProy.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("No se encontró el registro con ID: " + id));
return mapper.entityToDto(entity);
} catch (ResourceNotFoundException ex) {
throw ex;
} catch (Exception ex) { // Manejo de cualquier error en el servidor
throw new RuntimeException("Error al buscar el registro con ID: " + id);
}
}
@Override
public List<DtoUzyTavDepCenProy> ListarRegistros() {
try {
List<ModelUzyTavDepCenProy> entities = daoUzyTavDepCenProy.findAll();
return mapper.entitiesToDtos(entities);
} catch (Exception ex) {
throw new RuntimeException("Error al listar los registros: " + ex.getMessage());
}
}
@Override
public DtoUzyTavDepCenProy guardar(DtoUzyTavDepCenProy dtoUzyTavDepCenProy) {
try {
ModelUzyTavDepCenProy entity = mapper.dtoToEntity(dtoUzyTavDepCenProy);
ModelUzyTavDepCenProy nuevoEntity = daoUzyTavDepCenProy.save(entity);
return mapper.entityToDto(nuevoEntity);
} catch (Exception ex) {
throw new RuntimeException("Error al guardar el registro: " + ex.getMessage());
}
}
@Override
public DtoUzyTavDepCenProy editar(Long id, DtoUzyTavDepCenProy dtoUzyTavDepCenProy) {
if (id <= 0) {
throw new IllegalArgumentException("El ID del registro debe ser válido y mayor que cero.");
}
try {
ModelUzyTavDepCenProy entity = daoUzyTavDepCenProy.findById(id).get();
if (entity != null) {
if (dtoUzyTavDepCenProy.getStvsubj_code_depto() != null) {
entity.setStvsubj_code_depto(dtoUzyTavDepCenProy.getStvsubj_code_depto());
}
if (dtoUzyTavDepCenProy.getStvmajr_code_car() != null) {
entity.setStvmajr_code_car(dtoUzyTavDepCenProy.getStvmajr_code_car());
}
if (dtoUzyTavDepCenProy.getStvcamp_code() != null) {
entity.setStvcamp_code(dtoUzyTavDepCenProy.getStvcamp_code());
}
ModelUzyTavDepCenProy updatedEntity = daoUzyTavDepCenProy.save(entity);
return mapper.entityToDto(updatedEntity);
} else {
throw new ResourceNotFoundException("No se encontró el registro con ID: " + id);
}
} catch (Exception e) {
throw new ResourceNotFoundException("Error al editar el registro: " + e.getMessage());
}
}
@Override
public boolean eliminar(Long id) {
if (id == null || id <= 0) {
throw new IllegalArgumentException("El ID del registro debe ser válido y mayor que cero.");
}
try {
ModelUzyTavDepCenProy entity = daoUzyTavDepCenProy.findById(id).orElseThrow(() -> new ResourceNotFoundException("Registro no encontrado con ID: " + id));
if (entity != null) {
daoUzyTavDepCenProy.delete(entity);
return true;
}
return false;
} catch (ResourceNotFoundException ex) {
throw ex;
} catch (Exception ex) {
throw new RuntimeException("Error al eliminar el registro: " + ex.getMessage());
}
}
}
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 to comment