UDT-009: Overrides de PermisosJson por usuario — cierre módulo Auth #12
Reference in New Issue
Block a user
Delete Branch "feature/UDT-009"
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
Activación de
Usuario.PermisosJsoncomo overrides grant/deny por usuario. Cierre definitivo del módulo Auth (UDT-001 a UDT-009).Backend (.NET 10)
DF_Usuario_Permisoscon default{"grant":[],"deny":[]}+ UPDATE de filas legacy ('[]'/'["*"]'/ NULL) → shape canónicoPermisosOverriderecord +PermisoResolverstatic enApplication.Common— helper único consumido por LoginHandler y PermissionAuthorizationHandlerJwtServiceya no emite el claimpermisosdel token (era letra muerta). Token final:sub,jti,name,rolLoginCommandHandlerdevuelve permisos efectivos (rol ∪ grant) \ deny)PermissionAuthorizationHandleragrega dependenciaIUsuarioRepositoryy resuelve efectivos por request (sin cache)IUsuarioRepository.UpdatePermisosJsonAsyncnuevo método DapperGET /api/v1/users/{id}/permisos→{ rolPermisos, overrides: {grant, deny}, effective }PUT /api/v1/users/{id}/permisos/overridesbody{ grant, deny }InvalidPermisoCodesException+GrantDenyOverlapException→ 400 ProblemDetailsFrontend (React 19)
UserEditPagerefactorizado con Tabs Perfil / PermisosPermisosEditorcomponent tri-state (Heredado / Concedido / Denegado) agrupado por módulotabs.tsxshadcn sobre@radix-ui/react-tabs(paquete nuevo)useUserPermisos+useUpdateUserPermisosOverrideshooksSDD Artifacts (engram)
sdd/udt-009-permisos-overrides/*— explore / proposal / spec / design / tasks / apply-progressTest plan
dotnet test tests/SIGCM2.Application.Tests— 325/325dotnet test tests/SIGCM2.Api.Tests— 124/124cd src/web && npx vitest run— 136/136SIGCM2dev — 3 filas migradas al nuevo shapeadministracion:usuarios:gestionar→ acceso a/usuarios. Admin + denyadministracion:permisos:ver→ 403 en endpoint correspondiente.Close-out
Con UDT-009 el módulo Auth (UDT-001..006, 008, 009) queda 100% cerrado. RBAC completo con roles + overrides por usuario. Próximo critical path: ADM-001 (Medios y Secciones).
El backend devuelve { rolPermisos, overrides: {grant, deny}, effective } (nested) segun spec, pero el frontend lo lee como {grant, deny} planos. Causaba TypeError: permisoData.grant is not iterable al abrir tab Permisos. Tests del frontend actualizados con el shape correcto.