Skip to content

Commit

Permalink
Merge pull request #483 from open-commercial/issue482passwordrecovery
Browse files Browse the repository at this point in the history
Add new endpoint to change user password with recovery key
  • Loading branch information
belluccifranco authored Apr 1, 2024
2 parents 158571c + 9e63d57 commit 623614c
Show file tree
Hide file tree
Showing 11 changed files with 120 additions and 139 deletions.
36 changes: 15 additions & 21 deletions src/main/java/sic/controller/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import sic.service.IUsuarioService;

@RestController
@RequestMapping("/api/v1")
public class AuthController {

private final IUsuarioService usuarioService;
Expand All @@ -28,41 +27,36 @@ public AuthController(
this.authService = authService;
}

@PostMapping("/login")
@PostMapping("/api/v1/login")
public String login(@RequestBody Credencial credencial) {
Usuario usuario = usuarioService.autenticarUsuario(credencial);
return authService.generarJWT(
usuario.getIdUsuario(), usuario.getRoles());
var usuario = usuarioService.autenticarUsuario(credencial);
return authService.generarJWT(usuario.getIdUsuario(), usuario.getRoles());
}

@PutMapping("/logout")
public void logout(
@RequestHeader(value = "Authorization", required = false) String authorizationHeader) {
@PutMapping("/api/v1/logout")
public void logout(@RequestHeader(value = "Authorization", required = false) String authorizationHeader) {
if (authorizationHeader != null) {
authService.excluirTokenAcceso(authorizationHeader);
}
}

@GetMapping("/password-recovery")
public void recuperarPassword(
@RequestParam String email, @RequestParam long idSucursal, HttpServletRequest request) {
@GetMapping("/api/v1/password-recovery")
public void recuperarPassword(@RequestParam String email,
@RequestParam long idSucursal,
HttpServletRequest request) {
String origin = request.getHeader("Origin");
if (origin == null) origin = request.getHeader("Host");
usuarioService.enviarEmailDeRecuperacion(idSucursal, email, origin);
}

@PostMapping("/password-recovery")
public String generarTokenJWTTemporal(@RequestBody RecoveryPasswordDTO recoveryPasswordDTO) {
Usuario usuario =
usuarioService.getUsuarioPorPasswordRecoveryKeyAndIdUsuario(
recoveryPasswordDTO.getKey(), recoveryPasswordDTO.getId());
usuarioService.actualizarPasswordRecoveryKey(null, usuario.getIdUsuario());
return authService.generarJWT(usuario.getIdUsuario(), usuario.getRoles());
@PostMapping("/api/v1/password-recovery")
public void cambiarPasswordConRecuperacion(@RequestBody RecoveryPasswordDTO recoveryPasswordDTO) {
usuarioService.actualizarPasswordConRecuperacion(recoveryPasswordDTO.getKey(),
recoveryPasswordDTO.getId(), recoveryPasswordDTO.getNewPassword());
}

@PostMapping("/registracion")
public void registrarse(
@RequestBody RegistracionClienteAndUsuarioDTO registracionClienteAndUsuarioDTO) {
@PostMapping("/api/v1/registracion")
public void registrarse(@RequestBody RegistracionClienteAndUsuarioDTO registracionClienteAndUsuarioDTO) {
authService.validarRecaptcha(registracionClienteAndUsuarioDTO.getRecaptcha());
this.registracionService.crearCuenta(registracionClienteAndUsuarioDTO);
}
Expand Down
32 changes: 15 additions & 17 deletions src/main/java/sic/controller/UsuarioController.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import sic.modelo.dto.UsuarioDTO;
import sic.service.IAuthService;
import sic.service.IUsuarioService;
import sic.util.EncryptUtils;

@RestController
@RequestMapping("/api/v1")
Expand All @@ -25,17 +26,20 @@ public class UsuarioController {
private final IAuthService authService;
private final ModelMapper modelMapper;
private final MessageSource messageSource;
private final EncryptUtils encryptUtils;

@Autowired
public UsuarioController(
IUsuarioService usuarioService,
IAuthService authService,
ModelMapper modelMapper,
MessageSource messageSource) {
MessageSource messageSource,
EncryptUtils encryptUtils) {
this.usuarioService = usuarioService;
this.authService = authService;
this.modelMapper = modelMapper;
this.messageSource = messageSource;
this.encryptUtils = encryptUtils;
}

@GetMapping("/usuarios/{idUsuario}")
Expand All @@ -45,16 +49,14 @@ public Usuario getUsuarioPorId(@PathVariable long idUsuario) {

@PostMapping("/usuarios/busqueda/criteria")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR})
public Page<Usuario> buscarUsuarios(
@RequestBody BusquedaUsuarioCriteria criteria) {
public Page<Usuario> buscarUsuarios(@RequestBody BusquedaUsuarioCriteria criteria) {
return usuarioService.buscarUsuarios(criteria);
}

@PostMapping("/usuarios")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR})
public Usuario guardar(
@RequestBody UsuarioDTO usuarioDTO,
@RequestHeader("Authorization") String authorizationHeader) {
public Usuario guardar(@RequestBody UsuarioDTO usuarioDTO,
@RequestHeader("Authorization") String authorizationHeader) {
Claims claims = authService.getClaimsDelToken(authorizationHeader);
Usuario usuarioLoggedIn = this.getUsuarioPorId((int) claims.get("idUsuario"));
if (!usuarioLoggedIn.getRoles().contains(Rol.ADMINISTRADOR)
Expand All @@ -67,24 +69,20 @@ public Usuario guardar(
}

@PutMapping("/usuarios")
public void actualizar(
@RequestBody UsuarioDTO usuarioDTO,
@RequestHeader("Authorization") String authorizationHeader) {
public void actualizar(@RequestBody UsuarioDTO usuarioDTO,
@RequestHeader("Authorization") String authorizationHeader) {
Claims claims = authService.getClaimsDelToken(authorizationHeader);
Usuario usuarioLoggedIn = this.getUsuarioPorId((int) claims.get("idUsuario"));
boolean usuarioSeModificaASiMismo =
usuarioLoggedIn.getIdUsuario() == usuarioDTO.getIdUsuario();
boolean usuarioSeModificaASiMismo = usuarioLoggedIn.getIdUsuario() == usuarioDTO.getIdUsuario();
if (usuarioSeModificaASiMismo || usuarioLoggedIn.getRoles().contains(Rol.ADMINISTRADOR)) {
Usuario usuarioPorActualizar = modelMapper.map(usuarioDTO, Usuario.class);
Usuario usuarioPersistido = usuarioService.getUsuarioNoEliminadoPorId(usuarioDTO.getIdUsuario());
if (!usuarioLoggedIn.getRoles().contains(Rol.ADMINISTRADOR)) {
usuarioPorActualizar.setRoles(usuarioPersistido.getRoles());
usuarioPorActualizar.setHabilitado(usuarioPersistido.isHabilitado());
}
if (usuarioPorActualizar.getPassword() != null
&& !usuarioPorActualizar.getPassword().isEmpty()) {
usuarioPorActualizar.setPassword(
usuarioService.encriptarConMD5(usuarioPorActualizar.getPassword()));
if (usuarioPorActualizar.getPassword() != null && !usuarioPorActualizar.getPassword().isEmpty()) {
usuarioPorActualizar.setPassword(encryptUtils.encryptWithMD5(usuarioPorActualizar.getPassword()));
} else {
usuarioPorActualizar.setPassword(usuarioPersistido.getPassword());
}
Expand All @@ -96,8 +94,8 @@ public void actualizar(
}

@PutMapping("/usuarios/{idUsuario}/sucursales/{idSucursalPredeterminada}")
public void actualizarIdSucursalDeUsuario(
@PathVariable long idUsuario, @PathVariable long idSucursalPredeterminada) {
public void actualizarIdSucursalDeUsuario(@PathVariable long idUsuario,
@PathVariable long idSucursalPredeterminada) {
usuarioService.actualizarIdSucursalDeUsuario(idUsuario, idSucursalPredeterminada);
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/sic/modelo/dto/RecoveryPasswordDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ public class RecoveryPasswordDTO {

private String key;
private long id;
private String newPassword;
}
5 changes: 2 additions & 3 deletions src/main/java/sic/repository/ClienteRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.springframework.data.repository.query.Param;
import sic.modelo.Cliente;
import sic.modelo.Usuario;

import java.util.List;

public interface ClienteRepository extends
Expand All @@ -30,11 +29,11 @@ public interface ClienteRepository extends

@Modifying
@Query("UPDATE Cliente c SET c.viajante = null WHERE c.viajante.idUsuario = :idUsuarioViajante")
int desvincularClienteDeViajante(@Param("idUsuarioViajante") long idUsuarioViajante);
void desvincularClienteDeViajante(@Param("idUsuarioViajante") long idUsuarioViajante);

@Modifying
@Query("UPDATE Cliente c SET c.credencial = null WHERE c.credencial.idUsuario = :idUsuarioCredencial")
int desvincularClienteDeCredencial(@Param("idUsuarioCredencial") long idUsuarioCredencial);
void desvincularClienteDeCredencial(@Param("idUsuarioCredencial") long idUsuarioCredencial);

boolean existsByNroCliente(String nroCliente);
}
26 changes: 3 additions & 23 deletions src/main/java/sic/repository/UsuarioRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import sic.modelo.Rol;
import sic.modelo.Usuario;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

public interface UsuarioRepository extends
Expand All @@ -24,10 +20,9 @@ public interface UsuarioRepository extends
@Query("SELECT u FROM Usuario u "
+ "WHERE (u.username = :username OR u.email = :email) AND u.password = :password "
+ "AND u.eliminado = false")
Usuario findByUsernameOrEmailAndPasswordAndEliminado(
@Param("username") String username,
@Param("email") String email,
@Param("password") String password);
Usuario findByUsernameOrEmailAndPasswordAndEliminado(@Param("username") String username,
@Param("email") String email,
@Param("password") String password);

Usuario findByUsernameAndEliminado(String username, boolean eliminado);

Expand All @@ -38,20 +33,5 @@ Usuario findByUsernameOrEmailAndPasswordAndEliminado(
+ "AND u.eliminado = false AND u.habilitado = true")
Usuario findByPasswordRecoveryKeyAndIdUsuarioAndEliminadoAndHabilitado(String passwordRecoveryKey, long idUsuario);

@Modifying
@Query("UPDATE Usuario u "
+ "SET u.passwordRecoveryKey = ?1, u.passwordRecoveryKeyExpirationDate = ?2 "
+ "WHERE u.idUsuario = ?3")
int updatePasswordRecoveryKey(String passwordRecoveryKey,
LocalDateTime passwordRecoveryKeyExpirationDate,
long idUsuario);

@Modifying
@Query("UPDATE Usuario u "
+ "SET u.idSucursalPredeterminada = :idSucursalPredeterminada "
+ "WHERE u.idUsuario = :idUsuario")
int updateIdSucursal(
@Param("idUsuario") long idUsuario,
@Param("idSucursalPredeterminada") long idSucursalPredeterminada);
Page<Usuario> findAllByRolesContainsAndEliminado(Rol rol, boolean eliminado, Pageable pageable);
}
6 changes: 3 additions & 3 deletions src/main/java/sic/service/IUsuarioService.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ public interface IUsuarioService {

void actualizar(Usuario usuarioPorActualizar);

void actualizarPasswordRecoveryKey(String passwordRecoveryKey, long idUsuario);
void actualizarPasswordRecoveryKey(String passwordRecoveryKey, Usuario usuario);

void actualizarPasswordConRecuperacion(String key, long idUsuario, String newPassword);

void enviarEmailDeRecuperacion(long idSucursal, String email, String host);

Expand All @@ -32,7 +34,5 @@ public interface IUsuarioService {

Page<Usuario> getUsuariosPorRol(Rol rol);

String encriptarConMD5(String password);

boolean esUsuarioHabilitado(long idUsuario);
}
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ public List<String> getNuevaPreferenceParams(long idUsuario, NuevaOrdenDePagoDTO
}
var jsonObject = JsonParser.parseString(stringJson).getAsJsonObject();
try {
stringJson = encryptUtils.encryptWhitAES(jsonObject.toString());
stringJson = encryptUtils.encryptWithAES(jsonObject.toString());
} catch (GeneralSecurityException e) {
throw new ServiceException(
messageSource.getMessage("mensaje_error_al_encriptar", null, Locale.getDefault()), e);
Expand Down Expand Up @@ -263,7 +263,7 @@ public void crearComprobantePorNotificacion(long idPayment) {
var convertedObject =
new Gson()
.fromJson(
encryptUtils.decryptWhitAES(payment.getExternalReference()), JsonObject.class);
encryptUtils.decryptWithAES(payment.getExternalReference()), JsonObject.class);
var idUsuario = convertedObject.get(STRING_ID_USUARIO);
if (idUsuario == null) {
throw new BusinessServiceException(
Expand Down
Loading

0 comments on commit 623614c

Please sign in to comment.