14 KiB
14 KiB
US-ADM-003: Gestionar Permisos Personalizados
ID: US-ADM-003
Módulo: MAI-013
Relacionado con: RF-ADM-002, ET-ADM-001
Prioridad: Media
Story Points: 5
📖 Historia de Usuario
Como Director General
Quiero asignar permisos personalizados a usuarios específicos que excedan o limiten su rol base
Para adaptar el acceso según necesidades especiales sin crear nuevos roles
✅ Criterios de Aceptación
1. Ver Permisos de Usuario
Given que soy Director General
When accedo a "Usuarios" y selecciono un usuario
And hago clic en "Permisos"
Then debo ver dos secciones:
- "Permisos Base del Rol" (no editables, solo lectura)
- "Permisos Personalizados" (editables)
And cada permiso debe mostrar:
- Módulo
- Acciones permitidas (Create, Read, Update, Delete, Approve)
- Origen (Rol / Personalizado)
2. Agregar Permiso Personalizado
Given que estoy viendo permisos de un usuario con rol "engineer"
And su rol NO incluye permiso "approve" en módulo "budgets"
When hago clic en "+ Agregar Permiso Personalizado"
And selecciono:
- Módulo: "Presupuestos"
- Acción: "Aprobar"
- Condición: "Montos < $50,000 MXN" (opcional)
And hago clic en "Guardar"
Then el sistema debe:
- Agregar el permiso a la sección "Personalizados"
- Marcar visualmente que es un permiso adicional (badge "Extra")
- Registrar en audit log: "custom_permission_granted"
- Notificar al usuario por email
3. Revocar Permiso Base
Given que un usuario con rol "resident" tiene permiso "update" en "purchases"
When quiero restringir este permiso específicamente
And hago clic en "Revocar" junto al permiso
And confirmo la acción
Then el sistema debe:
- Crear una excepción negativa en permisos personalizados
- Marcar el permiso con badge "Revocado"
- El usuario pierde acceso a esa acción
- Registrar en audit log: "permission_revoked"
4. Permisos Temporales
Given que quiero dar acceso temporal a un usuario
When agrego un permiso personalizado
And marco la opción "Temporal"
And selecciono fecha de expiración: "2025-12-31"
Then el sistema debe:
- Guardar el permiso con fecha de expiración
- Mostrar countdown: "Expira en 45 días"
- Revocar automáticamente el permiso al llegar la fecha
- Enviar notificación 3 días antes de expirar
5. Permisos Condicionales
Given que agrego un permiso personalizado
When selecciono "Con Condiciones"
And configuro reglas:
- Campo: "monto"
- Operador: "<="
- Valor: "50000"
Then el sistema debe:
- Guardar la condición en JSON
- Validar en backend si se cumple la condición
- Mostrar en UI: "Aprobar presupuestos ≤ $50,000"
6. Previsualización de Acceso
Given que estoy editando permisos de un usuario
When hago clic en "Previsualizar Acceso"
Then debo ver una matriz completa con:
- Filas: Todos los módulos
- Columnas: CREATE, READ, UPDATE, DELETE, APPROVE
- Celdas con color:
- Verde: Permitido por rol
- Azul: Permitido por permiso personalizado
- Rojo: Denegado por excepción
- Gris: No permitido
🎨 Mockup / Wireframe
Panel de Permisos de Usuario
┌─────────────────────────────────────────────────────────────────┐
│ ← Usuarios / Juan Pérez │
├─────────────────────────────────────────────────────────────────┤
│ [Info] [Permisos] [Actividad] [Sesiones] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 📋 Permisos Base del Rol: Ingeniero [👁️ Preview]│
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Módulo CREATE READ UPDATE DELETE APPROVE │ │
│ │ ────────────────────────────────────────────────────────── │ │
│ │ Proyectos ✓ ✓ ✓ ✗ ✗ [ROL] │ │
│ │ Presupuestos ✓ ✓ ✓ ✗ ✗ [ROL] │ │
│ │ Obra ✓ ✓ ✓ ✗ ✗ [ROL] │ │
│ │ Compras ✗ ✓ ✗ ✗ ✗ [ROL] │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 🎯 Permisos Personalizados [+ Agregar Permiso] │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ✨ Presupuestos > Aprobar [Extra] │ │
│ │ Condición: Monto ≤ $50,000 MXN │ │
│ │ Expira: 31 Dic 2025 (45 días restantes) │ │
│ │ Otorgado por: María López el 15 Nov 2025 │ │
│ │ [Editar] [Revocar] │ │
│ │ │ │
│ │ 🚫 Compras > Eliminar [Revocado]│
│ │ Razón: Prevención de errores críticos │ │
│ │ Revocado por: María López el 18 Nov 2025 │ │
│ │ [Restaurar] │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Modal Agregar Permiso Personalizado
┌─────────────────────────────────────────────┐
│ Agregar Permiso Personalizado [X]│
├─────────────────────────────────────────────┤
│ │
│ Tipo * │
│ ◉ Otorgar permiso adicional │
│ ○ Revocar permiso del rol │
│ │
│ Módulo * │
│ [v] Presupuestos │
│ │
│ Acción * │
│ [v] Aprobar │
│ │
│ ☑️ Aplicar Condiciones │
│ ┌─────────────────────────────────────────┐ │
│ │ Campo Operador Valor │ │
│ │ [monto] [<=] [50000] [+ And]│ │
│ └─────────────────────────────────────────┘ │
│ │
│ ☑️ Permiso Temporal │
│ Expira el: [31/12/2025] 📅 │
│ │
│ Razón * │
│ ┌─────────────────────────────────────────┐ │
│ │ Necesita aprobar presupuestos pequeños │ │
│ │ durante ausencia del director │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ☑️ Notificar al usuario │
│ │
│ [Cancelar] [Agregar Permiso] │
└─────────────────────────────────────────────┘
Previsualización de Matriz de Permisos
┌─────────────────────────────────────────────────────────────────┐
│ Previsualización de Acceso: Juan Pérez (Ingeniero) [X]│
├─────────────────────────────────────────────────────────────────┤
│ │
│ Módulo CREATE READ UPDATE DELETE APPROVE │
│ ────────────────────────────────────────────────────────────── │
│ Proyectos 🟢 🟢 🟢 ⚫ ⚫ │
│ Presupuestos 🟢 🟢 🟢 ⚫ 🔵<$50K │
│ Obra 🟢 🟢 🟢 ⚫ ⚫ │
│ Compras ⚫ 🟢 ⚫ 🔴 ⚫ │
│ Contratos ⚫ 🟢 ⚫ ⚫ ⚫ │
│ RH ⚫ ⚫ ⚫ ⚫ ⚫ │
│ │
│ Leyenda: │
│ 🟢 Permitido por rol 🔵 Permiso personalizado │
│ 🔴 Revocado ⚫ No permitido │
│ │
│ [Cerrar] │
└─────────────────────────────────────────────────────────────────┘
🧪 Casos de Prueba
CP-001: Agregar Permiso Adicional
Precondiciones:
- Usuario "Juan" con rol "engineer"
- Director autenticado
Pasos:
- Ir a perfil de Juan > Permisos
- Clic en "+ Agregar Permiso Personalizado"
- Seleccionar: Presupuestos > Aprobar
- Agregar condición: monto <= 50000
- Guardar
Resultado Esperado:
- ✅ Permiso aparece en "Permisos Personalizados"
- ✅ Badge "Extra" visible
- ✅ Juan puede aprobar presupuestos ≤$50K
- ✅ Juan NO puede aprobar presupuestos >$50K
- ✅ Email enviado a Juan notificando cambio
CP-002: Revocar Permiso Base
Precondiciones:
- Usuario "Ana" con rol "resident"
- Rol incluye UPDATE en "purchases"
Pasos:
- Ir a perfil de Ana > Permisos
- En "Permisos Base", clic en "Revocar" junto a Compras > Update
- Confirmar revocación
Resultado Esperado:
- ✅ Permiso marcado como "Revocado" con badge rojo
- ✅ Ana pierde acceso a editar compras
- ✅ GET /api/users/me/permissions excluye ese permiso
- ✅ Audit log registra revocación
CP-003: Permiso Temporal Expira
Precondiciones:
- Usuario tiene permiso temporal que expira hoy a las 23:59
Pasos:
- Esperar a que llegue la fecha de expiración
- Verificar permisos del usuario
Resultado Esperado:
- ✅ Cron job revoca el permiso automáticamente
- ✅ Permiso removido de lista de personalizados
- ✅ Usuario recibe email: "Tu permiso temporal ha expirado"
- ✅ Audit log: "temporary_permission_expired"
CP-004: Validación de Condición
Precondiciones:
- Juan tiene permiso "approve budgets" con condición "monto <= 50000"
Pasos:
- Juan intenta aprobar presupuesto de $30,000
- Juan intenta aprobar presupuesto de $80,000
Resultado Esperado:
- ✅ Presupuesto $30K: Aprobación exitosa
- ✅ Presupuesto $80K: Error 403 "No tienes permiso para aprobar montos superiores a $50,000"
CP-005: Previsualización Correcta
Precondiciones:
- Usuario con permisos base + 2 personalizados + 1 revocado
Pasos:
- Abrir "Previsualizar Acceso"
Resultado Esperado:
- ✅ Matriz muestra todos los módulos y acciones
- ✅ Colores correctos según origen del permiso
- ✅ Tooltips explican condiciones
🔗 Dependencias
Requisitos Previos:
- ET-ADM-001: Tabla
custom_permissionsimplementada - ET-ADM-002: Sistema RBAC base funcional
- Backend: Guard que evalúa permisos personalizados
APIs Necesarias:
GET /api/users/:id/permissions- Permisos completos del usuarioPOST /api/users/:id/permissions/custom- Agregar permiso personalizadoDELETE /api/users/:id/permissions/custom/:permissionId- RevocarPUT /api/users/:id/permissions/custom/:permissionId- EditarPOST /api/users/:id/permissions/preview- Previsualizar matriz
📊 Métricas de Éxito
- Permisos personalizados activos: <10% del total de usuarios
- Tiempo de configuración: <2 minutos por permiso
- Precisión de condiciones: 100% (0 falsos positivos/negativos)
- Revocaciones automáticas: 100% al expirar
Generado: 2025-11-20
Estado: ✅ Listo para desarrollo