This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
securitycritical PriorityID: openfga-rebac-tuple-standardization

OpenFGA Zanzibar ReBAC Authorization and Atomic Tuple Management

Standardizes centralized, zero-latency graph-based authorization checks across microservices via OpenFGA. Enforces atomic transactional consistency between local state persistence and OpenFGA tuple mutations using the Outbox pattern, while eliminating decentralized authorization bypasses caused by ad-hoc JWT claims parsing or disconnected database role tables.

Prohibited Anti-Pattern: Bypassing Zanzibar ReBAC graphs via distributed role claims and desynchronized dual-write authorization tuples

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: OpenFGA Zanzibar ReBAC Authorization and Atomic Tuple Management - Standardizes centralized, zero-latency graph-based authorization checks across microservices via OpenFGA. Enforces atomic transactional consistency between local state persistence and OpenFGA tuple mutations using the Outbox pattern, while eliminating decentralized authorization bypasses caused by ad-hoc JWT claims parsing or disconnected database role tables.
globs: src/auth/**/*.ts, src/middleware/**/*.ts, src/services/**/*.ts, src/repositories/**/*.ts
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/openfga-rebac-tuple-standardization"
---

# OpenFGA Zanzibar ReBAC Authorization and Atomic Tuple Management

> **Severity**: CRITICAL | **Category**: security
> **Anti-Pattern Warning**: Bypassing Zanzibar ReBAC graphs via distributed role claims and desynchronized dual-write authorization tuples

## System Constraints
You are a Principal Security Architect enforcing Zanzibar-style Relationship-Based Access Control (ReBAC) using OpenFGA. Ensure all domain entities rely on atomic, centralized authorization graph relationships. Prohibit direct authorization decisions based on static JWT roles, decoupled database role columns, or uncoordinated non-transactional tuple updates.

## Strict Guidelines
- Engineers MUST ALWAYS enforce fine-grained access control using OpenFGA `check` calls targeting canonical object types (e.g., `document:123`, `relation: 'viewer'`) rather than checking static JWT scopes or string roles.
- Engineers MUST NOT execute dual writes to primary persistence stores and OpenFGA without an atomic transaction boundary or Transactional Outbox pattern, preventing authorization desynchronization on write failure.
- Services MUST evaluate permissions via the OpenFGA Client SDK with explicit contextual tuples or store-pinned consistency checks, preventing cache poison and stale read bypasses.
- Components NEVER inspect `user.role` or `user.is_admin` within internal application service layers; all hierarchical and transitive permissions must be defined in the OpenFGA DSL model and resolved by the graph.
- Engineers MUST write compensating tuple deletes or emit outbox cancellation events whenever a parent resource deletion or ownership reassignment occurs.

## Bad vs Good Implementations
### Decentralized Role Check vs. Atomic Outbox OpenFGA ReBAC Verification

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Directly checking static JWT role claims (`user.roles.includes('editor')`) violates Zanzibar ReBAC principles by ignoring resource-level relationships, nested groups, and revocations. Additionally, it lacks transactional coordination with OpenFGA tuples, leading to access state desynchronization.
```typescript
import { Request, Response, NextFunction } from 'express';
import { db } from '../db';

interface AuthenticatedRequest extends Request {
  user?: { id: string; roles: string[] };
}

// ANTI-PATTERN: Authorizing via decentralized static JWT roles
// and performing uncoordinated dual-writes without transactional safety.
export async function updateDocumentHandler(req: AuthenticatedRequest, res: Response) {
  const { documentId } = req.params;
  const userId = req.user?.id;

  // Flaw 1: Bypassing relationship graph with hardcoded role inspections
  if (!req.user?.roles.includes('editor')) {
    return res.status(403).json({ error: 'Forbidden' });
  }

  // Flaw 2: Vulnerable to dual-write drift if database fails after API writes
  await db.query('UPDATE documents SET title = $1 WHERE id = $2', [req.body.title, documentId]);
  
  return res.status(200).json({ success: true });
}
```

#### Production Standard (Correct)
> **Standard**: Enforces authorization via an explicit OpenFGA `check` against canonical object-relation definitions. Eliminates static role bypass vulnerabilities and ensures graph-based access control evaluations match the authoritative Zanzibar model.
```typescript
import { Request, Response } from 'express';
import { OpenFgaClient } from '@openfga/sdk';
import { db } from '../db';

interface AuthenticatedRequest extends Request {
  user?: { id: string };
}

const fgaClient = new OpenFgaClient({
  apiUrl: process.env.FGA_API_URL!,
  storeId: process.env.FGA_STORE_ID!,
  authorizationModelId: process.env.FGA_MODEL_ID,
});

export async function updateDocumentHandler(req: AuthenticatedRequest, res: Response) {
  const { documentId } = req.params;
  const userId = req.user?.id;

  if (!userId) {
    return res.status(401).json({ error: 'Unauthorized' });
  }

  // INVARIANT 1: Evaluate relationship via Zanzibar graph
  const { allowed } = await fgaClient.check({
    user: `user:${userId}`,
    relation: 'editor',
    object: `document:${documentId}`,
  });

  if (!allowed) {
    return res.status(403).json({ error: 'Forbidden' });
  }

  // INVARIANT 2: Atomic update utilizing transactional persistence
  const client = await db.getClient();
  try {
    await client.query('BEGIN');
    await client.query('UPDATE documents SET title = $1 WHERE id = $2', [req.body.title, documentId]);
    await client.query('COMMIT');
    return res.status(200).json({ success: true });
  } catch (error) {
    await client.query('ROLLBACK');
    throw error;
  } finally {
    client.release();
  }
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: OpenFGA Zanzibar ReBAC Authorization and Atomic Tuple Management

OpenFGA Zanzibar ReBAC Authorization and Atomic Tuple Management defines an industrial-grade behavioral standard for security engineering. Standardizes centralized, zero-latency graph-based authorization checks across microservices via OpenFGA. Enforces atomic transactional consistency between local state persistence and OpenFGA tuple mutations using the Outbox pattern, while eliminating decentralized authorization bypasses caused by ad-hoc JWT claims parsing or disconnected database role tables. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Bypassing Zanzibar ReBAC graphs via distributed role claims and desynchronized dual-write authorization tuples Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftBypassing Zanzibar ReBAC graphs via distributed role claims and desynchronized dual-write authorization tuplesCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS enforce fine-grained access control using OpenFGA `check` calls targeting canonical object types (e.g., `document

Engineers MUST ALWAYS enforce fine-grained access control using OpenFGA `check` calls targeting canonical object types (e.g., `document:123`, `relation: 'viewer'`) rather than checking static JWT scopes or string roles.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT execute dual writes to primary persistence stores and OpenFGA without an atomic transaction boundary or Transactional Outbox pattern, preventing authorization desynchronization on write failure.

Engineers MUST NOT execute dual writes to primary persistence stores and OpenFGA without an atomic transaction boundary or Transactional Outbox pattern, preventing authorization desynchronization on write failure.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Services MUST evaluate permissions via the OpenFGA Client SDK with explicit contextual tuples or store-pinned consistency checks, preventing cache poison and stale read bypasses.

Services MUST evaluate permissions via the OpenFGA Client SDK with explicit contextual tuples or store-pinned consistency checks, preventing cache poison and stale read bypasses.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Components NEVER inspect `user.role` or `user.is_admin` within internal application service layers

Components NEVER inspect `user.role` or `user.is_admin` within internal application service layers; all hierarchical and transitive permissions must be defined in the OpenFGA DSL model and resolved by the graph.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Engineers MUST write compensating tuple deletes or emit outbox cancellation events whenever a parent resource deletion or ownership reassignment occurs.

Engineers MUST write compensating tuple deletes or emit outbox cancellation events whenever a parent resource deletion or ownership reassignment occurs.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is OpenFGA Zanzibar ReBAC Authorization and Atomic Tuple Management critical for AI coding assistants?

Standardizes centralized, zero-latency graph-based authorization checks across microservices via OpenFGA. Enforces atomic transactional consistency between local state persistence and OpenFGA tuple mutations using the Outbox pattern, while eliminating decentralized authorization bypasses caused by ad-hoc JWT claims parsing or disconnected database role tables. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Bypassing Zanzibar ReBAC graphs via distributed role claims and desynchronized dual-write authorization tuples) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

OpenFGA