erp-core/docs/01-fase-foundation/MGN-002-users/historias-usuario/US-MGN002-003.md

6.3 KiB

US-MGN002-003: Cambio de Password

Identificacion

Campo Valor
ID US-MGN002-003
Modulo MGN-002 Users
Sprint Sprint 2
Prioridad P0 - Critica
Story Points 3
Estado Ready
Autor System
Fecha 2025-12-05

Historia de Usuario

Como usuario autenticado del sistema Quiero poder cambiar mi contraseña Para mantener mi cuenta segura y cumplir con politicas de rotacion


Criterios de Aceptacion

Escenario 1: Cambio exitoso

Given un usuario autenticado
When proporciona password actual correcto "OldPass123!"
  And nuevo password "NewPass456!" cumple requisitos
Then el sistema actualiza el password
  And guarda hash en password_history
  And envia email de notificacion
  And responde con status 200

Escenario 2: Password actual incorrecto

Given un usuario autenticado
When proporciona password actual incorrecto
Then el sistema responde con status 400
  And el mensaje es "Password actual incorrecto"

Escenario 3: Nuevo password no cumple requisitos

Given un usuario autenticado
When el nuevo password es "abc123"
Then el sistema responde con status 400
  And lista los requisitos no cumplidos:
    | Debe tener al menos 8 caracteres |
    | Debe incluir una mayuscula       |
    | Debe incluir caracter especial   |

Escenario 4: Password reutilizado

Given un usuario que uso "MiPass123!" hace 2 meses
When intenta cambiar a "MiPass123!"
Then el sistema responde con status 400
  And el mensaje es "No puedes usar un password que hayas usado anteriormente"

Escenario 5: Cerrar otras sesiones

Given un usuario con 3 sesiones activas
When cambia password con logoutOtherSessions=true
Then el sistema actualiza el password
  And invalida las otras 2 sesiones
  And la sesion actual permanece activa
  And responde con sessionsInvalidated: 2

Mockup / Wireframe

+------------------------------------------------------------------+
|  [Logo]   Cambiar Contraseña                                      |
+------------------------------------------------------------------+
|                                                                   |
|   ┌─────────────────────────────────────────────────────────┐    |
|   │ CAMBIAR CONTRASEÑA                                       │    |
|   ├─────────────────────────────────────────────────────────┤    |
|   │                                                          │    |
|   │ Contraseña actual                                        │    |
|   │ [•••••••••••••••••••                        ] 👁         │    |
|   │                                                          │    |
|   │ Nueva contraseña                                         │    |
|   │ [•••••••••••••••••••                        ] 👁         │    |
|   │ [████████████░░░░░░░░] Fuerte                            │    |
|   │                                                          │    |
|   │ ✓ Minimo 8 caracteres                                   │    |
|   │ ✓ Al menos una mayuscula                                │    |
|   │ ✓ Al menos una minuscula                                │    |
|   │ ✗ Al menos un numero                                    │    |
|   │ ✗ Al menos un caracter especial                         │    |
|   │                                                          │    |
|   │ Confirmar nueva contraseña                               │    |
|   │ [•••••••••••••••••••                        ] 👁         │    |
|   │                                                          │    |
|   │ ☐ Cerrar sesion en otros dispositivos                   │    |
|   │                                                          │    |
|   │ [  Cancelar  ]           [ Cambiar Contraseña ]         │    |
|   └─────────────────────────────────────────────────────────┘    |
|                                                                   |
+------------------------------------------------------------------+

Notas Tecnicas

API Endpoint

POST /api/v1/users/me/password
{
  "currentPassword": "OldPass123!",
  "newPassword": "NewPass456!",
  "confirmPassword": "NewPass456!",
  "logoutOtherSessions": true
}

// Response 200
{
  "message": "Password actualizado exitosamente",
  "sessionsInvalidated": 2
}

// Response 400 - Password incorrecto
{
  "statusCode": 400,
  "message": "Password actual incorrecto"
}

// Response 400 - No cumple politica
{
  "statusCode": 400,
  "message": "El password no cumple los requisitos",
  "errors": [
    "Debe incluir al menos una mayuscula",
    "Debe incluir al menos un caracter especial"
  ]
}

Politica de Password

- Minimo 8 caracteres
- Maximo 128 caracteres
- Al menos 1 mayuscula
- Al menos 1 minuscula
- Al menos 1 numero
- Al menos 1 caracter especial (!@#$%^&*)
- No puede contener el email
- No puede ser igual a los ultimos 5

Definicion de Done

  • Endpoint POST /api/v1/users/me/password
  • Validacion de password actual
  • Validacion de politica de complejidad
  • Verificacion contra historial (5 anteriores)
  • Opcion de cerrar otras sesiones
  • Email de notificacion enviado
  • Frontend: ChangePasswordForm
  • Frontend: PasswordStrengthIndicator
  • Tests unitarios
  • Code review aprobado

Estimacion

Tarea Horas
Backend: Endpoint 2h
Backend: Validaciones 2h
Backend: Tests 1h
Frontend: Form + indicator 3h
Frontend: Tests 1h
Total 9h

Historial

Version Fecha Autor Cambios
1.0 2025-12-05 System Creacion inicial