Roles y Permisos (RBAC)
Auris implementa el control de acceso basado en roles (RBAC) con un modelo de resolución de permisos de tres estados: los permisos pueden ser explícitamente ALLOW (permitir), explícitamente DENY (denegar) o INHERIT (heredar del valor predeterminado del rol). Las anulaciones de permisos a nivel de usuario tienen precedencia sobre los permisos a nivel de rol, permitiendo excepciones detalladas sin crear roles dedicados.
Formato de Permisos
Todos los permisos en Auris siguen el patrón acción:recurso:
manage:users view:invoices create:tickets
edit:roles approve:expenses delete:documents
assign:tickets sign:interventions export:reportsEl componente acción describe qué habilita el permiso. Acciones comunes: view, create, edit, delete, manage, approve, assign, export, sign, generate.
El componente recurso describe la entidad o función a la que se accede. Los recursos corresponden a módulos en tu aplicación.
Existe un permiso especial — admin:all — que otorga acceso sin restricciones a todos los recursos cuando lo tiene un rol. Se asigna al rol integrado Administrador.
Creación de Roles
Desde la Consola
- Ve a Consola → Roles → Crear Rol
- Introduce un nombre (ej.
Gestor de Facturas), descripción opcional y elige un color para la insignia del rol - El rol se crea sin permisos. Configura los permisos en la página de detalle del rol.
Desde la API
/api/rolesRequires: manage:rolesCrea un nuevo rol. Cuerpo: { name: string, description?: string, color?: string }.
// Usando el Management Client de Auris
const management = await createManagementClient({ ... })
const rol = await management.roles.create({
name: 'Gestor de Facturas',
description: 'Puede crear y ver facturas pero no eliminarlas',
color: '#3b82f6',
})Configuración de Permisos
Categorías de Permisos
El editor de permisos de la Consola organiza los permisos en 10 categorías:
| Categoría | Permisos de ejemplo |
|---|---|
| Documentos | view:invoices, create:quotes, approve:expenses, sign:interventions |
| Usuarios | view:users, manage:users, import:users, export:users |
| Roles | view:roles, manage:roles, assign:roles |
| Aplicaciones | view:applications, manage:applications, manage:api_keys |
| Organizaciones | view:organizations, manage:organizations, manage:sso_connections |
| Seguridad | view:audit_logs, manage:attack_protection, view:sessions |
| Facturación | view:billing, manage:subscriptions |
| Integraciones | view:integrations, manage:webhooks, manage:automations |
| Infraestructura | view:monitoring, manage:devices, manage:firewalls |
| Soporte | view:tickets, create:tickets, assign:tickets, manage:sla |
Establecer Permisos en un Rol
En la Consola, cada permiso tiene un selector de tres estados en la página de detalle del rol:
- ALLOW — El permiso se concede a los usuarios con este rol
- DENY — El permiso se deniega explícitamente, anulando ALLOW heredado de otros roles
- INHERIT — El rol ni concede ni deniega este permiso (predeterminado)
A un usuario se le concede un permiso si cualquiera de sus roles lo tiene configurado como ALLOW y ninguno de sus roles lo tiene configurado como DENY.
Desde la API
/api/roles/:id/permissionsRequires: manage:rolesActualiza los permisos del rol. Cuerpo: { permissions: { [permission: string]: 'ALLOW' | 'DENY' | 'INHERIT' } }.
Asignación de Roles a Usuarios
Los roles se asignan a usuarios en la Consola (Usuarios → [Usuario] → pestaña Roles) o a través de la API:
/api/users/:id/rolesRequires: manage:usersAsigna uno o más roles a un usuario. Cuerpo: { roleIds: string[] }.
/api/users/:id/roles/:roleIdRequires: manage:usersElimina un rol de un usuario.
Los usuarios pueden tener múltiples roles. Los permisos de todos los roles se fusionan. Si algún rol tiene DENY para un permiso, esto anula ALLOW de otros roles.
Anulaciones de Permisos a Nivel de Usuario
Los usuarios individuales pueden tener permisos establecidos directamente, independientemente de sus roles. Las anulaciones de usuario tienen precedencia sobre todos los permisos de rol:
- Una ALLOW a nivel de usuario concede el permiso aunque ningún rol lo otorgue
- Una DENY a nivel de usuario bloquea el permiso aunque un rol otorgue ALLOW
Consola: Usuarios → [Usuario] → pestaña Permisos → Añadir Anulación
/api/users/:id/permission-overridesRequires: manage:usersEstablece una anulación de permiso para un usuario específico. Cuerpo: { permission: string, effect: 'ALLOW' | 'DENY' }.
Verificación de Permisos
Del Lado del Servidor (Rutas de API)
Usa el helper requirePermission() para aplicar permisos en rutas de API:
Route Handler Next.js
// app/api/invoices/route.ts
import { requirePermission } from '@auris/nextjs/server'
const config = {
domain: process.env.NEXT_PUBLIC_AURIS_DOMAIN!,
clientId: process.env.NEXT_PUBLIC_AURIS_CLIENT_ID!,
}
export const GET = requirePermission('view:invoices', config, async (req, { session }) => {
// Solo se alcanza si el usuario tiene el permiso view:invoices
const facturas = await obtenerFacturas(session.user.id)
return Response.json(facturas)
})
export const POST = requirePermission('create:invoices', config, async (req, { session }) => {
const body = await req.json()
const factura = await crearFactura(body, session.user.id)
return Response.json(factura, { status: 201 })
})Del Lado del Cliente (Componentes React)
Hook React
import { useCheckPermission, usePermissions } from '@auris/react'
// Verificar un único permiso
function AccionesFactura() {
const { allowed: puedeCrear, isLoading } = useCheckPermission('create:invoices')
const { allowed: puedeEliminar } = useCheckPermission('delete:invoices')
if (isLoading) return null
return (
<div>
{puedeCrear && <button>Nueva Factura</button>}
{puedeEliminar && <button>Eliminar Seleccionadas</button>}
</div>
)
}
// Verificar múltiples permisos a la vez
function NavDashboard() {
const { has, hasAll, hasAny } = usePermissions([
'view:invoices',
'view:quotes',
'manage:users',
'view:billing',
])
return (
<nav>
{has('view:invoices') && <a href="/invoices">Facturas</a>}
{has('view:quotes') && <a href="/quotes">Presupuestos</a>}
{has('manage:users') && <a href="/users">Usuarios</a>}
{has('view:billing') && <a href="/billing">Facturación</a>}
{hasAll(['view:invoices', 'view:quotes']) && <a href="/documents">Todos los Documentos</a>}
{hasAny(['manage:users', 'manage:roles']) && <a href="/es/admin">Administración</a>}
</nav>
)
}API de Permisos
/api/roles/checkVerifica uno o más permisos para el usuario autenticado. Cuerpo: { permissions: string[] } o { permission: string }. Devuelve un array de objetos { permission, allowed }.
/api/rolesRequires: view:rolesLista todos los roles del tenant, incluyendo el número de permisos y usuarios.
/api/roles/:idRequires: view:rolesObtiene un rol específico incluyendo su conjunto completo de permisos.
/api/roles/:idRequires: manage:rolesElimina un rol. Los usuarios que tenían este rol pierden los permisos asociados inmediatamente.
Orden de Resolución de Permisos
Cuando Auris resuelve si un usuario tiene un permiso específico, sigue esta precedencia:
- DENY de anulación a nivel de usuario — Si existe, el permiso es denegado. No se evalúa más.
- ALLOW de anulación a nivel de usuario — Si existe (y no hay DENY), el permiso es concedido.
- Permisos de rol — Si algún rol tiene ALLOW y ningún rol tiene DENY, el permiso es concedido.
- Denegación implícita — Si ninguna regla concede el permiso, es denegado.
DENY de anulación de usuario → DENEGADO (se detiene aquí)
ALLOW de anulación de usuario → CONCEDIDO (se detiene aquí)
DENY de cualquier rol → DENEGADO (se detiene aquí)
ALLOW de cualquier rol → CONCEDIDO
Sin coincidencia → DENEGADOPermisos con Alcance de Aplicación
Los permisos pueden, opcionalmente, tener alcance para una aplicación específica. Cuando se incluye un applicationId en una verificación de permisos, Auris evalúa los permisos dentro del contexto de esa aplicación — útil para tenants con múltiples aplicaciones donde los roles pueden diferir por aplicación.
const resultado = await fetch('/api/roles/check', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
permissions: ['view:invoices', 'create:invoices'],
applicationId: 'app-id-de-la-app-de-facturacion',
}),
})Guías Relacionadas
- Autorización de Grano Fino — Control de acceso a nivel de objeto más allá de los roles
- Claims JWT Personalizados — Incrustar datos de roles o permisos en los access tokens
- Credenciales M2M (Client Credentials) — Autorización para llamadas servidor a servidor