0014. Catálogo inicial de permisos (cat_permisos)¶
Estado: Propuesto
Fecha: 2026-09-08
Autor: Duval Alcivar
Módulo(s) afectado(s): svc-identidad (core_sigfa), todos los servicios que validan permisos en el JWT
Contexto¶
El ADR 0007 define cat_permisos (catálogo de permisos, generales y por
módulo/página) y rel_usuario_permiso (asignación individual), y registra como
pendiente 0014 el catálogo inicial de permisos por módulo/acción. El ADR
0013 define la plantilla de módulos → páginas → acciones. Este ADR define: (1)
las reglas de códigos de permiso (el namespace que viaja en el JWT), (2) el
catálogo inicial generado desde la plantilla, y (3) cómo se compactan
los claims cuando el usuario acumula muchos permisos.
Decisión¶
1. Reglas de códigos de permiso¶
El codigo de cat_permisos es el identificador estable que viaja en el
claim permisos del JWT y que cada servicio compara contra sus operaciones.
Regla: <modulo>.<pagina>.<accion> → permiso de una acción de una página
<modulo>.* → todo dentro del módulo (wildcard)
Ejemplos (por módulo):
rrhh.nomina.crear, rrhh.asistencia.reportes.exportar,
inventario.bajas.eliminar, permisos.usuarios.asignar, reportes.exportar
(global, sin página), rrhh.*.
- Un permiso por acción de la plantilla (ADR 0013). El código es único por
(empresa_id NULL, codigo)para los del catálogo base. - Códigos de plataforma (empresa_id NULL): no dependen de la empresa; se
otorgan con
rel_usuario_permiso.empresa_id = NULL(alcance global) o conempresa_idconcreto. - Códigos de módulos propios de una empresa (creados vía ADR 0013): se
insertan con
empresa_idNOT NULL y mismos patrones de código.
2. 'Ver' es implícito (no gasta permisos)¶
Ver una página ya está dado por rel_usuario_menu (ADR 0007/0012): si el
usuario tiene la página, la ve. No se genera ni se firma un permiso ver para
el funcionamiento normal; solo se modela como acción/código cuando la página
exige verificación especial (p. ej. permisos.detalle.confidencial).
Esto mantiene el claim pequeño: la navegación la controla
rel_usuario_menuy la ejecución (crear/editar/eliminar/firmar…) la controlan los códigos de acción (ADR 0015). Elrootno lleva códigos (ADR 0007).
3. Catálogo inicial (cat_permisos global)¶
Se genera desde la plantilla del ADR 0013 (una fila por acción, más los
resúmenes .* por módulo). Subconjunto representativo:
| codigo | Alcance | Origen |
|---|---|---|
permisos.usuarios.crear |
módulo permisos | plantilla core |
permisos.usuarios.editar |
módulo permisos | plantilla core |
permisos.usuarios.eliminar |
módulo permisos | plantilla core |
permisos.asignar |
módulo permisos (página asignar) | plantilla core |
empresas.gestion |
global (root de plataforma) | plantilla core |
rrhh.nomina.crear |
módulo rrhh | plantilla erp |
rrhh.nomina.editar |
módulo rrhh | plantilla erp |
rrhh.nomina.eliminar |
módulo rrhh | plantilla erp |
rrhh.nomina.aprobar |
módulo rrhh (página registro) | plantilla erp |
rrhh.asistencia.reportes.exportar |
módulo rrhh (página reportes) | plantilla erp |
inventario.bajas.crear |
módulo inventario | plantilla erp |
contabilidad.conciliar |
módulo contabilidad | plantilla erp |
promotores.rutas.crear |
módulo promotores | plantilla crm |
ventas.cotizaciones.aprobar |
módulo ventas | plantilla crm |
ventas.pedidos.anular |
módulo ventas | plantilla crm |
rrhh.* |
resumen: todo rrhh | generado por módulo |
- El seed vive con la plantilla (ADR 0013) en migraciones versionadas; se sincroniza cuando cambia la plantilla (nueva página/acción ⇒ nuevos códigos).
- Los resúmenes
.*por módulo son filas reales decat_permisosy se otorgan igual que cualquier otro permiso (para "todo rrhh" sin listar cada acción).
4. Wildcard y tamaño del claim¶
El claim permisos lleva solo los códigos otorgados. La validación en el
servicio destino es:
authorized(code) ⇔ token.tipo_usuario == "root"
∨ ∃ granted ∈ token.permisos : granted == code
∨ granted == "<módulo>.*" (prefijo del code)
- Otorgar
rrhh.*reemplaza docenas de códigos sueltos: el token se mantiene pequeño y la resolución es local (sin consultas). - Se mantiene alerta de tamaño: si un usuario supera ~40 códigos efectivos sin
usar wildcards, se recomienda asignar
.<modulo>.*enrel_usuario_permiso(regla antigua de la deuda del ADR 0007, ahora resuelta por.*).
5. Endpoints¶
| Endpoint | Método | Qué hace |
|---|---|---|
/api/v1/permisos |
GET | listar cat_permisos (ADR 0009); filtrable por módulo/aplicación |
/api/v1/permisos |
POST | alta de un permiso nuevo (módulo propio de empresa, ADR 0016) |
/api/v1/permisos/{id} |
PATCH | editar nombre/descripción (nunca el codigo) |
Alternativas descartadas¶
- Omitir
cat_permisosy validar solorel_usuario_menu_accion— deja sin representación los permisos de dominio que no cuelgan de una página (globales:reportes.exportar);cat_permisoses el namespace estable. - Claims sin wildcard — el usuario "jefe de módulo" acarrearía decenas de códigos; el token crece sin razón.
- Códigos legibles solo en backend (no en el claim) — obligaría a una consulta por petición; rompe "validar sin consultar BD" (ADR 0007/0011).
Consecuencias¶
- Existe un único namespace de permisos (
<modulo>.<pagina>.<accion>y.*) entendido por todos los servicios a partir del token. verno gasta claim: navegación vs ejecución quedan separadas y baratas.- Seed sincronizado con la plantilla del ADR 0013: página nueva ⇒ permiso nuevo, sin código muerto.
- Resuelto: pendiente 0014 del README (catálogo inicial de permisos por módulo/acción).
La asignación de estos códigos a un usuario se hace con rel_usuario_permiso
(ADR 0007) o por página con rel_usuario_menu_accion (ADR 0015). La firma en
el JWT está en el ADR 0011.