Autorización de Grano Fino (FGA)
Auris FGA es un motor de autorización basada en relaciones (ReBAC) al estilo Zanzibar para el control de acceso a nivel de objeto. Mientras que RBAC responde “¿tiene este usuario el permiso global view:invoices?”, FGA responde “¿tiene este usuario la relación viewer sobre el documento #123 específicamente?”.
FGA es la herramienta adecuada cuando la autorización depende de relaciones entre objetos específicos — no solo de los roles del usuario.
Casos de uso comunes:
- Un sistema de compartición de documentos donde cada documento tiene sus propios propietarios, editores y lectores
- Un SaaS multi-tenant donde el acceso a un proyecto depende de la pertenencia a una organización
- Un sistema de archivos donde los permisos de una carpeta son heredados por su contenido
- Un portal B2B donde los contactos de cada cliente solo pueden ver los datos de su propia organización
FGA reemplaza a Ory Keto como capa ReBAC de Auris. Establece FGA_ENGINE_ENABLED=true en el entorno de la API para activar FGA. Si es false, el sistema recurre a Keto (obsoleto).
Conceptos Fundamentales
Objetos
Un objeto es una entidad en tu sistema identificada por un tipo y un ID, escrito como tipo:id. Ejemplos:
document:inv-2024-001folder:invoices-q4project:website-redesignorganization:acme-corp
Relaciones
Una relación describe cómo un sujeto está conectado a un objeto. Las relaciones se definen en el modelo de autorización. Ejemplos: owner, editor, viewer, member, admin.
Sujetos
Un sujeto es la entidad que se autoriza. Los sujetos también se escriben como tipo:id. El tipo de sujeto más común es user. Los sujetos también pueden ser conjuntos — organization:acme-corp#member significa “cualquier persona que sea miembro de la organización acme-corp”.
Tuplas
Una tupla de relación es un hecho almacenado: (objectType, objectId, relation, subjectType, subjectId). Por ejemplo: “user:alice es viewer del document:report-2024” se almacena como:
{
"objectType": "document",
"objectId": "report-2024",
"relation": "viewer",
"subjectType": "user",
"subjectId": "alice"
}Modelos de Autorización
El modelo de autorización es un esquema escrito en un DSL compatible con OpenFGA. Define qué tipos existen y qué relaciones soporta cada tipo.
Sintaxis DSL
type user
type organization
relations
define admin: [user]
define member: [user] or admin
type project
relations
define org: [organization]
define admin: [user] or admin from org
define editor: [user] or admin
define viewer: [user] or editor
type document
relations
define project: [project]
define owner: [user]
define editor: [user] or owner or editor from project
define viewer: [user] or editor or viewer from project or member from org of projectEste modelo define:
- Cualquier usuario puede ser
memberoadminde una organización - Un proyecto pertenece a una organización; los administradores del proyecto heredan de los de la organización
- Un documento pertenece a un proyecto; su conjunto de viewers incluye viewers directos, editores, viewers del proyecto y miembros de la organización
Tipos de Reescritura
Auris FGA soporta 6 tipos de reescritura para calcular la pertenencia a una relación:
| Tipo | Descripción | Sintaxis DSL |
|---|---|---|
this | Búsqueda directa de tupla | [user] |
computedUserset | Miembros de otra relación en el mismo objeto | or owner |
tupleToUserset | Sigue una relación a otro objeto y obtiene su relación | viewer from project |
union | Usuarios en cualquiera de los operandos | [user] or owner |
intersection | Usuarios en todos los operandos | [user] and verified |
exclusion | Usuarios en el operando izquierdo pero no en el derecho | [user] but not blocked |
Crear y Activar un Modelo
/api/fga/modelsRequires: manage:fga_modelsCrea una nueva versión del modelo de autorización. Cuerpo: { name: string, dsl: string }. Auris analiza y valida el DSL antes de almacenarlo.
/api/fga/models/:id/activateRequires: manage:fga_modelsActiva una versión del modelo. Solo puede estar activo un modelo a la vez. Activar un nuevo modelo no invalida las tuplas existentes.
Escritura de Tuplas
Las tuplas son los datos de tiempo de ejecución — las relaciones reales entre objetos y sujetos en tu aplicación.
/api/fga/tuplesRequires: manage:fga_tuplesEscribe una o más tuplas de relación. Cuerpo: { writes: TupleInput[] }. Cada tupla: { objectType, objectId, relation, subjectType, subjectId, subjectRelation? }.
/api/fga/tuplesRequires: manage:fga_tuplesElimina una o más tuplas de relación. Cuerpo: { deletes: TupleInput[] }.
/api/fga/tuples/bulkRequires: manage:fga_tuplesEscribe y elimina tuplas en una sola solicitud atómica. Cuerpo: { writes: TupleInput[], deletes: TupleInput[] }. Máximo 100 operaciones por solicitud.
// Compartir un documento con un usuario (escribir una tupla)
await fetch('/api/fga/tuples', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
writes: [
{
objectType: 'document',
objectId: 'report-2024',
relation: 'viewer',
subjectType: 'user',
subjectId: 'bob',
},
],
}),
})
// Revocar acceso (eliminar una tupla)
await fetch('/api/fga/tuples', {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
deletes: [
{
objectType: 'document',
objectId: 'report-2024',
relation: 'viewer',
subjectType: 'user',
subjectId: 'bob',
},
],
}),
})Verificación de Autorización
Check
El endpoint check responde “¿tiene el sujeto X la relación R sobre el objeto Y?”
/api/fga/checkEvalúa si un sujeto tiene una relación sobre un objeto. Devuelve { allowed: boolean }. No requiere autenticación — usa la identidad del caller del access token a menos que se proporcione un sujeto explícito.
Expand
El endpoint expand devuelve el conjunto completo de sujetos que tienen una relación dada sobre un objeto, útil para depuración y para construir paneles de compartición orientados al usuario.
/api/fga/expandRequires: view:fga_tuplesExpande una relación para mostrar todos los sujetos (con la ruta de resolución). Cuerpo: { objectType, objectId, relation }.
List Objects
El endpoint list-objects devuelve todos los objetos de un tipo dado sobre los que un sujeto tiene una relación especificada — útil para filtrar resultados de consultas.
/api/fga/list-objectsRequires: view:fga_tuplesLista todos los objetos donde el sujeto tiene la relación dada. Cuerpo: { objectType, relation, subjectType, subjectId, cursor?, limit? }.
Uso del SDK
React
import { useFga } from '@auris/react'
function PaginaDocumento({ documentId }) {
const { check, listObjects, isLoading } = useFga()
const [puedeEditar, setPuedeEditar] = useState(false)
useEffect(() => {
check({
object: `document:${documentId}`,
relation: 'editor',
}).then((result) => setPuedeEditar(result.allowed))
}, [documentId])
return (
<div>
<h1>Documento</h1>
{puedeEditar ? (
<button>Editar Documento</button>
) : (
<span>Solo lectura</span>
)}
</div>
)
}
// Panel de compartición — mostrar quién tiene acceso
function PanelComparticion({ documentId }) {
const { expand } = useFga()
const [lectores, setLectores] = useState([])
useEffect(() => {
expand({
objectType: 'document',
objectId: documentId,
relation: 'viewer',
}).then((result) => setLectores(result.subjects))
}, [documentId])
return (
<ul>
{lectores.map((lector) => (
<li key={lector.subjectId}>{lector.subjectId}</li>
))}
</ul>
)
}Patrones Comunes
Modelo Google Drive
Una jerarquía donde los permisos de las carpetas se propagan a los documentos:
type user
type folder
relations
define owner: [user]
define editor: [user] or owner
define viewer: [user] or editor
define parent: [folder]
define editor_via_parent: editor from parent
define viewer_via_parent: viewer from parent
type document
relations
define owner: [user]
define parent_folder: [folder]
define editor: [user] or owner or editor_via_parent from parent_folder
define viewer: [user] or editor or viewer_via_parent from parent_folderModelo SaaS Multi-Tenant
La pertenencia a una organización controla el acceso a proyectos y recursos:
type user
type organization
relations
define admin: [user]
define member: [user] or admin
type project
relations
define organization: [organization]
define admin: [user] or admin from organization
define member: [user] or member from organization or admin
type resource
relations
define project: [project]
define owner: [user]
define editor: [user] or owner or admin from project
define viewer: [user] or editor or member from projectDepuración con la Consola FGA
La Consola de Auris incluye un Depurador de FGA en Consola → Autorización → Depurador con tres herramientas:
- Check: Prueba cualquier combinación objeto/relación/sujeto y visualiza el árbol de resolución
- Expand: Visualiza el conjunto completo de sujetos para cualquier relación
- List Objects: Encuentra todos los objetos a los que un usuario tiene acceso
El árbol de resolución muestra exactamente qué tuplas y reescrituras del modelo llevaron al resultado allowed: true o allowed: false — esencial para diagnosticar resultados de autorización inesperados.
Plantillas de Modelo
La Consola proporciona tres plantillas de modelo para empezar rápidamente:
- Básico: Modelo usuario/recurso simple con owner, editor, viewer
- SaaS: Jerarquía organización → proyecto → recurso con pertenencia a equipo
- Drive: Jerarquía anidada carpeta/documento con permisos heredados
Guías Relacionadas
- Roles y Permisos (RBAC) — Autorización basada en roles para permisos a nivel de aplicación
- Claims JWT Personalizados — Incrustar datos derivados de FGA en los access tokens
- Credenciales M2M (Client Credentials) — Verificaciones FGA del lado del servidor desde servicios backend