UDT-005: Gestión de Permisos (RBAC) — catálogo + asignación rol↔permisos #9
Reference in New Issue
Block a user
Delete Branch "feature/UDT-005"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implementa el modelo RBAC granular de SIG-CM 2.0: catálogo de 18 permisos, asignación M:N
Rol ↔ Permiso, CRUD admin para editar permisos por rol. Sin enforcement (UDT-006) ni override por usuario (UDT-008).Decisiones clave
heredaDeentre roles, sin wildcard). El roladmintiene los 18 permisos EXPLÍCITOS enRolPermiso.adminen la migración. Registrado en engram comoarchitecture/rbac-admin-convention.Usuario.PermisosJson) diferido a UDT-008.[RequirePermission]) diferido a UDT-006.Cambios
V005__create_permiso.sql(tabla + seed 18),V006__create_rol_permiso.sql(tabla M:N + seed 36 rows).Permissions/Permiso.cs(18const string),Entities/Permiso.cs,PermisoNotFoundException.IPermisoRepository,IRolPermisoRepository, 3 handlers (ListPermisos,GetRolPermisos,AssignPermisosToRol) + validators FluentValidation.PermisoRepository,RolPermisoRepositoryconReplaceForRolAsyncen transacción explícita.PermisosControllercon 3 endpoints[Authorize(Roles="admin")].ExceptionFilterextendido.features/permisos/con grid checkbox agrupado por módulo, ruta/admin/permisos, link en sidebar.2.4.2 Autorización (RBAC).mdactualizado (modelo plano, override diferido, convención admin).Endpoints
GET /api/v1/permisos→ 200PermisoDto[]GET /api/v1/roles/{codigo}/permisos→ 200 | 400 (codigo inválido) | 404PUT /api/v1/roles/{codigo}/permisosbody{ codigos: string[] }→ 200 | 400 (admin vacío / codigo inválido) | 404 (rol o permiso inexistente)Test plan
SIGCM2_Test(18 permisos, 36 asignaciones)dotnet test SIGCM2.Application.Tests→ 220/220 ✅dotnet test SIGCM2.Api.Tests→ 47/47 ✅RolPermisoverificado en BDTablesToIgnoreprotege seed en todos los fixtures de integración{codigos:[]}→ 400Follow-ups
Ninguno abierto en esta UDT. Issue #5 (
ProtectedRoutegranular) reasignado a UDT-006 por decisión D4.Trazabilidad engram
sdd/udt-005-gestion-permisos/proposalsdd/udt-005-gestion-permisos/specsdd/udt-005-gestion-permisos/designsdd/udt-005-gestion-permisos/taskssdd/udt-005-gestion-permisos/apply-progresssdd/udt-005-gestion-permisos/verify-reportarchitecture/rbac-admin-convention- api/types.ts: PermisoDto, AssignPermisosRequest - api/listPermisos, getRolPermisos, assignPermisos - hooks: usePermisos, useRolPermisos, useAssignPermisos (TanStack Query) - components/RolPermisosEditor: checkbox-grid agrupado por modulo (codigo.split(':')[0]) - pages/RolPermisosPage: selector rol activo + guard admin + RolPermisosEditor - router.tsx: ruta /admin/permisos - AppSidebar.tsx: link Permisos (KeyRound icon) en seccion admin - tests: 5 smoke tests RolPermisosEditor (render, prefill, toggle, save, 400)Agrega GetRolPermisosQueryValidator con regex ^[a-z][a-z0-9_]*$ para rechazar codigos invalidos con 400 en GET /api/v1/roles/{codigo}/permisos.