Saltar al contenido principal

Gestion de Permisos (RBAC)

Este documento define la fuente oficial de permisos para frontend y backend.

1. Roles oficiales

RolClaveDescripcion
PacientePATIENTBusca servicios, agenda citas, paga, califica y administra favoritos.
Profesional de saludDOCTORGestiona agenda/perfil profesional, cupones y contenido publico.
Administrador de entidadENTITY_ADMINGestiona sedes, convenios, personal operativo y agenda de entidad.
Administrador de catalogosCATALOG_ADMINAdministra taxonomia medica y geografia (pais/departamento/municipio).
Super administradorSUPERADMINModeracion/auditoria, seguridad y acceso a operaciones criticas.

Notas:

  • Los roles son acumulativos: un usuario puede tener PATIENT + DOCTOR + ENTITY_ADMIN.
  • Todo usuario inicia con PATIENT; los roles adicionales se otorgan por flujo de onboarding/auditoria.

2. Matriz de acceso (alto nivel)

Dominio/ModuloPATIENTDOCTORENTITY_ADMINCATALOG_ADMINSUPERADMIN
Auth y perfil comun (/auth/*, /profiles/me)OwnOwnOwnOwnAll
Perfil profesional (/profiles/doctor)-Own C/URead afiliados-All
Entidades y convenios (/entities, /insurance-agreements)ReadReadOwn C/U-All
Citas (/appointments)Own C/R/UOwn R/UEntity R/U-All
Disponibilidad (/availability/*)ReadOwn C/UEntity C/U-All
Reseñas (/reviews)Own C/RReadRead-Moderar
Cupones (/professional/coupons, /coupons/*)Validate/ApplyOwn C/R/UOwn C/R/U-Aprobar/Rechazar
Blog profesional (/professional/posts)Read publicoOwn C/R/UOwn C/R/U-Moderar
Catalogos (/admin/catalogs/*, /meta/*)ReadReadReadC/R/UC/R/U
Auditoria (/admin/audits/*)----C/R/U
Soporte (/help/tickets)CCCCC/R/U

2.1 Matriz RBAC detallada (recurso/accion/condicion)

RecursoAccionRoles permitidosCondicion de autorizacion
profiles.meread, updateTodos autenticadossubject_id == profile.user_id
profiles.doctorcreate, updateDOCTOR, SUPERADMINPropio perfil o override admin
entitiescreateENTITY_ADMIN, SUPERADMINUsuario verificado + terminos aceptados
entitiesupdateENTITY_ADMIN, SUPERADMINScope por entity_id afiliada
catalogs.geocreate, update, disableCATALOG_ADMIN, SUPERADMINNo romper referencias; audit obligatorio
catalogs.taxonomycreate, update, disableCATALOG_ADMIN, SUPERADMINSolo 2 niveles (area/especialidad)
appointmentscreatePATIENT, SUPERADMINSlot disponible + convenio valido
appointmentsupdate, cancelPATIENT, DOCTOR, ENTITY_ADMIN, SUPERADMINOwnership o tenant entity
reviewscreatePATIENTSolo cita finalizada y no duplicada
reviewsmoderateSUPERADMINAuditoria de decision obligatoria
couponscreate, updateDOCTOR, ENTITY_ADMIN, SUPERADMINOwner del coupon o tenant scope
auditslist, resolveSUPERADMINreason, decision, trace_id requeridos
notifications.preferencesupdateTodos autenticadosSolo preferencias propias

Convencion de acciones: create/read/update/delete/disable/moderate/resolve.
En catalogos se prioriza disable (soft-delete) sobre delete.

3. Reglas de autorizacion obligatorias

  1. Least privilege: si no existe regla explicita, el acceso es denegado (403).
  2. Ownership check: endpoints Own requieren validar resource.owner_id == subject_id.
  3. Tenant scope: ENTITY_ADMIN solo opera recursos de sus entidades.
  4. Estados de auditoria: recursos PENDING/REJECTED/SUSPENDED no son publicables en buscador.
  5. Soft delete primero: para catalogos y contenido administrativo, preferir enabled=false antes de eliminar.
  6. Trazabilidad: toda decision de permisos/auditoria debe registrar who/when/why en audit_logs.

4. Implementacion en Go (DDD + Clean)

4.1 Capa HTTP (interfaces/http)

  • Middleware JWT: autentica, valida firma/expiracion y carga claims (sub, roles, country_code, locale).
  • Middleware RBAC: valida rol requerido por endpoint.
  • Guard de ownership/tenant: valida alcance de recurso antes de llamar caso de uso.
// ejemplo simplificado
func RequireRoles(allowed ...string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
claims := auth.ClaimsFromContext(r.Context())
if !auth.HasAnyRole(claims.Roles, allowed...) {
http.Error(w, "forbidden", http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
}
}

4.2 Capa aplicacion (use cases)

  • Validaciones de negocio y ownership no deben quedarse solo en middleware.
  • Cada caso de uso sensible debe revalidar permisos de dominio.

4.3 Capa dominio

  • Las entidades no conocen JWT ni framework HTTP.
  • Las politicas de acceso se modelan como reglas/aprobaciones en aplicacion + servicios de dominio.

5. Respuesta estandar de errores de permiso

CasoHTTPCodigo sugerido
Sin token / token invalido401UNAUTHORIZED
Rol insuficiente403FORBIDDEN
Recurso fuera de tenant403TENANT_FORBIDDEN
Recurso inexistente404NOT_FOUND

6. Checklist de implementacion

  • Todos los endpoints en OpenAPI tienen security y rol esperado documentado.
  • Endpoints Own validan ownership en middleware y use case.
  • Eventos sensibles (ROLE_GRANTED, ROLE_REVOKED, AUDIT_DECISION) se auditan.
  • Tests de autorizacion cubren 401, 403, 404 y casos cross-tenant.
  • Frontend oculta acciones por rol, pero backend sigue siendo fuente de verdad.