Article · Access control
What is relationship-based access control?
Relationship-based access control, or ReBAC, decides who may open a record by how they are connected to it: a member of the team that owns the folder the record sits in. The permissions are stored as relationships in a graph. Each check asks whether a path leads from the record to the person.
In short
Relationship-based access control grants access when a chain of relationships connects a person to a resource. A typical chain runs from a person to a team, from the team to a folder it owns, and from the folder to a document. The relationships are data, stored beside the records they protect, and every check is a question about that data.
Its two neighbors ask different questions. Role-based access control (RBAC) asks which role a person holds. Attribute-based access control (ABAC) asks whether the attributes of the person, the resource and the moment satisfy a policy. An Auth0 article puts the ReBAC version in one line: “Instead of asking, "What role does this user have?" ReBAC asks, "How is this user related to this resource?".”
This article is about how that check works and where it fits. Where in a search or an assistant the check belongs is covered in What is permission-aware retrieval?.
Roles, attributes and relationships
NIST’s guide to ABAC describes RBAC as pre-defined roles that carry privileges, to which people are assigned. Roles made central access management possible, and they still fit coarse questions: who may sign in, who may administer. They fit records badly. The role “mechanic” either reads every maintenance log or none. Narrowing it means a role per base, per fleet, per customer, which the same guide names role explosion.
ABAC evaluates a policy over attributes at the moment of the request: the person’s department, the record’s classification, the time of day, the device. It handles conditions well. It needs every attribute defined the same way in every system, and it does not follow links: the fact that a log belongs to an aircraft serviced at your base is a relationship, not an attribute of you.
ReBAC stores that link. The OWASP Authorization Cheat Sheet recommends preferring ABAC and ReBAC over RBAC for application development. It notes that ReBAC permits permissions on individual objects, not only on roles. The models also combine: a role can be one more relationship, and a condition such as the time of day can sit on top of a relationship check.
How a check runs
A check is a walk
Can Ana open maintenance log ML-208? The check starts at the log and follows its relationships outward until it reaches her, or runs out. Pick a step to stop the drawing and read it.
- 01
The question
Can Ana open maintenance log ML-208? Five nodes and four relationships stand between the two.
- 02
Start at the record
The log is filed in the A320 fleet folder.
- 03
Follow ownership
The line crew team owns the folder, and with it everything filed there.
- 04
Follow membership
Ana is in Base HAM, a team nested in the line crew. A path exists, so she may open the log.
- 05
No path, no access
Ben is in quality. No chain of relationships leads from the log to him, so the check says no.
What Google’s Zanzibar showed
The reference design is Zanzibar, the authorization system Google described at USENIX in 2019. Its paper reports that it serves Calendar, Cloud, Drive, Maps, Photos and YouTube. It stores each permission as a relation tuple: user U has relation R to object O. A check takes one form: “does user U have relation R to object O?”
Two ideas in the paper explain why ReBAC stays compact. Groups are objects too, so a group can be a member of another group, and a check may follow a chain of nested memberships. And rewrite rules derive one relation from another: every editor of a document is also a viewer, and every viewer of a folder is a viewer of the documents in it. One tuple on a folder then covers every document filed under it, with no row per document.
The paper also ties access to search. It describes listing everyone who can reach an object so that a search index for access-controlled content can be built from that list. The permissions an index needs are the same relationships the checks walk.
Why it fits enterprise data
Source systems already think in relationships. A SharePoint site has members, a Jira project has roles, a ticket belongs to a support group, a document sits in a folder. ReBAC can take those relationships as they are, instead of mapping each one onto a role someone invents and then maintains.
Changes stay small. When a mechanic moves from line maintenance to quality, one membership edge goes and one arrives. Every record reachable through the old team drops out at the next check, and every record of the new team comes in. No record is touched, and nothing is relabeled.
When people move
A new team is one edge
Ana moves from the line crew to quality. Her access changes with one edge, and no record is edited.
- 01
Access is a set of paths
Ana is in the line crew, which owns three maintenance records. Those are what she can open.
- 02
She leaves the line crew
One membership edge is removed. Nothing else changes.
- 03
One new edge
Ana joins quality. That is the whole change to her access.
- 04
The next check follows it
The quality team’s records are reachable now, and the line crew’s are not.
- 05
No record was touched
What Ana can open changed by five records, and not one record was edited or relabeled.
How it goes wrong
- Deep walks on every request. A check that follows nested groups for every record of a search is slow. Systems compute a person’s full group set once and reuse it, or store the allowed groups with each record in the index.
- Relationships that are stale. A check is only as current as the edges it reads. A membership synced once a night grants a night of access after someone leaves a team.
- Conditions forced into edges. The time of day or the device a person uses is not a relationship. Model those as a policy on top of the relationship check, not as edges.
- Everything public. A folder shared with the whole company is a relationship too, and every check honors it.
- A path that skips the check. Code that reads data in a system context, without the person’s identity, sees everything. One such call in a user-facing feature is enough to leak.
How to evaluate it
Six questions, asked of a real record and two real people:
- Where do the relationships come from: the source systems, the identity provider, or a second list someone keeps by hand?
- Can the system explain a decision, showing the chain from the record to the person?
- Does it answer the reverse question too: who can open this record?
- Are nested groups followed, and to what depth?
- How long does a removed membership take to reach the check?
- Does the same check cover search, a record fetched by id, counts, single fields and an assistant’s tools?
How Curiosity does it
In Curiosity Studio permissions are edges in the same graph as the data, as the access control model describes. Users and teams are nodes. Membership is a pair of edges, and ownership another pair, from a record to the user or team that owns it. A check walks ownership outward from the record and asks whether it reaches the person, directly or through teams nested to any depth.
The engine computes each user’s full set of teams once and caches it, and drops the cache when a team changes. Connectors write the ownership edges together with the records, so access is synced from the source systems. Teams can also be mapped from your identity provider’s groups, refreshed at each sign in. Node types, single fields, endpoints, AI tools and assistants can each be restricted to teams.
Access is checked per record at query time, by the graph engine and by search, as the permission model architecture sets out. Custom endpoints call the same check through the user context variants. The Access Debugger draws the chain that gives a user access to a node. The security page and the Trust Center have the rest.
References
Sources and further reading
Zanzibar: Google’s Consistent, Global Authorization System
Pang et al., USENIX ATC · July 2019
Relation tuples, checks of the form “does user U have relation R to object O?”, nested groups and rewrite rules.
ReadSP 800-162, Guide to Attribute Based Access Control
NIST · January 2014, updated August 2019
The working definition of ABAC, how RBAC differs, and role explosion.
ReadAuthorization Cheat Sheet
OWASP Cheat Sheet Series
RBAC, ABAC and ReBAC compared, and why the cheat sheet prefers the last two for application development.
ReadUnderstanding ReBAC and ABAC Through OpenFGA and Cedar
Auth0 · October 2025
ReBAC as relationship tuples in a graph, against policies evaluated over attributes.
ReadAccess control model
Curiosity documentation
Users, teams, ownership and membership edges, nested teams and how the engine resolves them.
ReadPermission model architecture
Curiosity documentation
Where Studio enforces access: the graph engine, the search engine and custom endpoints.
ReadDebugging access
Curiosity documentation
What a user can see, and the chain of edges that explains why they can see one node.
ReadFAQ
Questions people ask
Does relationship-based access control replace roles?
Not entirely. Roles still fit coarse questions, such as who may administer a system. ReBAC handles which records a person may open. A role can also be modeled as one more relationship, and a condition such as the time of day can sit on top of a relationship check.
What is Google Zanzibar?
The authorization system Google described in a 2019 USENIX paper. It stores permissions as relation tuples, such as a user being a viewer of a document, and answers checks for services including Calendar, Cloud, Drive, Maps, Photos and YouTube.
Does Curiosity Studio support nested teams?
Yes. A team can be a member of another team, to any depth. Whatever a parent team owns is visible to the members of every team nested inside it, and nothing flows sideways between sibling teams. Nested teams are created from code, for example by a connector mirroring the source system’s groups.
How can I see why a user has access to a record?
In Curiosity Studio, the Access Debugger takes a user and a node and draws the chain that carries the access: the ownership edges, the teams they lead to, and the user’s membership in them. A chain that stops short shows where.
Articles
Read next
What is permission-aware retrieval?
Permissions
Why an assistant may only read what the person asking may open, where the access check belongs, and how permissions go stale.
ReadWhat is a knowledge graph?
Knowledge graphs
Entities, typed relationships and a schema. How a knowledge graph differs from a table and a search index, and how to tell a useful one from a diagram.
ReadWhat is prompt injection?
Prompt injection
Direct and indirect injection, why no filter stops it reliably, the lethal trifecta, and the designs that limit what a steered assistant can do.
ReadYour data. Your infrastructure.