Skip to Content

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-001
  • folder:invoices-q4
  • project:website-redesign
  • organization: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 project

Este modelo define:

  • Cualquier usuario puede ser member o admin de 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:

TipoDescripciónSintaxis DSL
thisBúsqueda directa de tupla[user]
computedUsersetMiembros de otra relación en el mismo objetoor owner
tupleToUsersetSigue una relación a otro objeto y obtiene su relaciónviewer from project
unionUsuarios en cualquiera de los operandos[user] or owner
intersectionUsuarios en todos los operandos[user] and verified
exclusionUsuarios en el operando izquierdo pero no en el derecho[user] but not blocked

Crear y Activar un Modelo

POST/api/fga/modelsRequires: manage:fga_models

Crea una nueva versión del modelo de autorización. Cuerpo: { name: string, dsl: string }. Auris analiza y valida el DSL antes de almacenarlo.

POST/api/fga/models/:id/activateRequires: manage:fga_models

Activa 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.

POST/api/fga/tuplesRequires: manage:fga_tuples

Escribe una o más tuplas de relación. Cuerpo: { writes: TupleInput[] }. Cada tupla: { objectType, objectId, relation, subjectType, subjectId, subjectRelation? }.

DELETE/api/fga/tuplesRequires: manage:fga_tuples

Elimina una o más tuplas de relación. Cuerpo: { deletes: TupleInput[] }.

POST/api/fga/tuples/bulkRequires: manage:fga_tuples

Escribe 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?”

POST/api/fga/check

Evalú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.

POST/api/fga/expandRequires: view:fga_tuples

Expande 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.

POST/api/fga/list-objectsRequires: view:fga_tuples

Lista todos los objetos donde el sujeto tiene la relación dada. Cuerpo: { objectType, relation, subjectType, subjectId, cursor?, limit? }.


Uso del SDK

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_folder

Modelo 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 project

Depuració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