<aside> 🔐
A premium, production-minded guide to SpiceDB: the Google Zanzibar-inspired authorization database for relationship-based access control (ReBAC) — with modern patterns for Java + Spring Boot, microservices, consistency, and ops.
</aside>
<aside> 🎯
What it solves
Stop scattering if/else authorization logic across services. Centralize the question: “Can subject X do action Y on resource Z?” using a live relationship graph.
</aside>
<aside> ⚡
Why it’s different
Permissions are computed at query time from the live graph (not static policy files), enabling correctness at scale.
</aside>
<aside> 🏗️
How to use it
Treat SpiceDB as the PDP. Every microservice is a PEP that enforces decisions before executing business actions.
</aside>
SpiceDB is not an authentication library and not “just RBAC”. It’s a relationship database for fine-grained authorization — designed to answer permission checks with single‑digit millisecond latency even at massive scale, inspired by Google’s Zanzibar system.
| System | Model | Live relationship graph? | Best for |
|---|---|---|---|
| SpiceDB | ReBAC (+ RBAC + ABAC) | ✅ Yes | Per‑resource authorization at scale (multi‑tenant SaaS, content, shared workspaces) |
| OPA / Rego | ABAC (policy-as-code) | ❌ No | Gateway/coarse rules, k8s admission, platform controls |
| Casbin | RBAC/ABAC embedded | ❌ No | Single-service apps, low complexity |
| Custom DB RBAC | RBAC | Partial | Simple apps (but tends to break under growth and microservices) |
<aside> 📚
Object type (definition): user, document, folder, org
Relation: viewer, editor, owner, member
Permission: computed boolean like can_view
Relationship: instance like document:budget#viewer@user:alice
PEP: app/service enforcing decisions
PDP: SpiceDB (the decision engine)
ZedToken: consistency cursor (Causality) to avoid stale decisions
</aside>
<aside> 🧠
Design principle: relations are your “data model” (breaking changes); permissions are your “views” (safe to evolve). Design relations conservatively; permissions expressively.
</aside>

/** Example: A multi-tenant document management system */
/** user represents an authenticated principal */
definition user {}
/** organization groups users into tenants */
definition organization {
relation member: user
relation admin: user
permission is_member = member + admin
}
/** team belongs to an org; has members */
definition team {
relation org: organization
relation member: user | team#member
permission has_membership = member
}
/** folder groups documents; can be nested */
definition folder {
relation org: organization
relation parent: folder
relation viewer: user | team#member
relation editor: user | team#member
relation owner: user
permission view = viewer + editor + owner + parent->view
permission edit = editor + owner + parent->edit
permission delete = owner
permission manage = owner
}
/** document is the primary protected resource */
definition document {
relation org: organization
relation folder: folder
relation owner: user
relation editor: user | team#member
relation viewer: user | team#member
permission can_view = viewer + editor + owner + folder->view + org->is_member
permission can_edit = editor + owner + folder->edit
permission can_delete = owner
permission can_share = owner + folder->manage
}