Skip to main content
Relationship-Based Access Control (ReBAC) grants permissions based on the relationships between users and resources — and between resources themselves. Permify is built on ReBAC at its core, inspired by Google Zanzibar. This guide covers four key ReBAC patterns:

User Groups

Managing access for groups is more efficient than assigning roles to individual users at scale. If a user belongs to a group, they inherit the group’s permissions.
1

Define the base entities

entity user {}

entity organization {
    // organizational roles
    relation admin  @user
    relation member @user
}
2

Model the team entity as a group

A team has an owner, direct members, and a reference back to the organization it belongs to. Permissions on the team itself use boolean combinations of these relations.
entity team {
    // represents owner or creator of the team
    relation owner  @user

    // represents direct members of the team
    relation member @user

    // reference for the organization this team belongs to
    relation org    @organization

    // org admins or team owners can edit and delete
    permission edit        = org.admin or owner
    permission delete      = org.admin or owner

    // inviting requires being an org admin AND a team owner or member
    permission invite      = org.admin and (owner or member)

    // only team owners can remove users
    permission remove_user = owner
}
3

Attach resources to the group

A project references both its team and its organization. Permissions are expressed in terms of team membership and org roles.
entity project {
    relation team @team
    relation org  @organization

    permission view   = org.admin or team.member
    permission edit   = org.admin or team.member
    permission delete = team.member
}

Complete Schema

entity user {}

entity organization {
    relation admin  @user
    relation member @user
}

entity team {
    relation owner  @user
    relation member @user
    relation org    @organization

    permission edit        = org.admin or owner
    permission delete      = org.admin or owner
    permission invite      = org.admin and (owner or member)
    permission remove_user = owner
}

entity project {
    relation team @team
    relation org  @organization

    permission view   = org.admin or team.member
    permission edit   = org.admin or team.member
    permission delete = team.member
}
This model establishes a hierarchy where organizations contain teams, which in turn contain projects. A user’s membership in a team automatically propagates to every project that team owns.

Build docs developers (and LLMs) love