zealamic

payload plugin rbac

by zealamic
Roles & permissions
v3
^3.84.1
MIT

Overview

Summary generated from the README

Adds role-based access control to Payload v3 by registering collections for features, actions, permissions and roles. Permissions are edited in the admin and enforced through access helpers such as getPermissionAccess. Supports multi-role users, super admins and data scopes (own, hierarchy, all). Requires a database migration after setup.

Features

  • Five RBAC collections for features, actions, permissions, roles and a join table
  • Role permission matrix UI in the admin that syncs on save
  • Data scope of own, hierarchy or all with row-level filtering
  • targetCollections option adds a hidden ownership field and create hook
  • Drag-and-drop reorder of permission features and actions
  • Translatable admin labels and a customizable matrix field component

Use cases

  • Manage editor and admin permissions in the admin panel without redeploying code
  • Restrict users to viewing or editing only the documents they created
  • Apply hierarchical visibility so managers can see their team's content

From the author

A plugin for Payload CMS to manage authentication and authorization

Installation

npm i @zealamic/payload-plugin-rbac

10

Stars

1

Forks

0

Open Issues

3 months ago

Last Updated

27

Weekly Downloads

v1.3.0

npm Version

478.3 KB

Unpacked Size

0

Dependencies

GitHub stars

Trends appear after 7 days of data. Daily snapshots have not started yet.

npm weekly downloads

Trends appear after 7 days of data. Daily snapshots have not started yet.

Each point is npm's rolling 7-day download count.

Health Score

56/100Good

Composite score based on GitHub activity, stars, npm downloads, publish recency, dependency count, and package size.

Badge for your README

Payload Directory health badge
Markdown
[![Payload Directory](https://payloaddirectory.dev/badge/1251146173-root.svg)](https://payloaddirectory.dev/plugins/1251146173-root)
HTML
<a href="https://payloaddirectory.dev/plugins/1251146173-root"><img src="https://payloaddirectory.dev/badge/1251146173-root.svg" alt="Payload Directory"></a>
Updated Jul 3, 2026Created May 27, 2026Published Jul 3, 2026

README

@zealamic/payload-plugin-rbac

Centralized role-based access control (RBAC) for Payload CMS v3 (payload ^3.84.1). Not compatible with Payload 2.x.

Payload Auth RBAC Plugin

Permissions live in the database (feature + action), are assigned to roles, and enforced via reusable access helpers — editable in Admin without redeploying policy code.

Row-level access (dataScope): list collection slugs in targetCollections for auto ownership field + create hook, then wire getPermissionAccess. → COLLECTIONS — targetCollections · manual setup → UTILS


Documentation

GuideRead when you need to…
COLLECTIONSPlugin collections, users augmentation, dataScope, permission matrix, field/access overrides
UTILSgetPermissionAccess, data-scope filters, field merge helpers
TRANSLATIONSAdmin labels, select options, matrix UI strings (en, vi, …)
CUSTOM_COMPONENTSCustom matrix checkboxes / search input (client field component)

Typical flow: install → register plugin with targetCollections (COLLECTIONS) → run migration → seed RBAC data (COLLECTIONS) → add getPermissionAccess on app collections (UTILS) → translate Admin UI (TRANSLATIONS).

Demos in this repo: dev/rbac.ts, dev/collections/posts.ts, dev/components/role-permission-matrix-field.tsx.


Key features

  • Five RBAC collections — features, actions, permissions, roles, join table (details)
  • Multi-role users — union of enabled grants across assigned roles
  • Granular permissions — any featureCode + actionCode pair (helpers)
  • Data scope — own / hierarchy / all; use targetCollections for ownership field + hook, or add manually (UTILS)
  • targetCollections — auto-add hidden ownership field + create hook on app collections (COLLECTIONS)
  • Auth users slug — config.admin.user (default users) for hierarchy + options.usersCollectionSlug
  • Permission matrix — role update UI; syncs draft → roles-permissions on save
  • Reorder drawers — drag-and-drop sortOrder for permission features and actions on each collection list view
  • Custom matrix UI — optional client field component + render props (CUSTOM_COMPONENTS)
  • TypeScript — typed plugin config and exported helpers/types from the main package
  • i18n — plugin translations merged into Payload i18n (guide)

Installation

npm install @zealamic/payload-plugin-rbac
# or: yarn add / pnpm add @zealamic/payload-plugin-rbac

Quick start

1. Register the plugin

import { payloadPluginRBAC } from "@zealamic/payload-plugin-rbac";

export default buildConfig({
  plugins: [
    payloadPluginRBAC({
      autoModifyUsersCollection: true, // roles, isSuperAdmin, parent, default user access
      targetCollections: ["posts"], // ownership field + create hook — see step 4
      // collections: { ... }   → https://github.com/zealamic/payload-plugin-rbac/blob/main/docs/COLLECTIONS.md
      // translations: { ... } → https://github.com/zealamic/payload-plugin-rbac/blob/main/docs/TRANSLATIONS.md
      // components: { rolePermissionMatrixField: "..." } → custom matrix Field (client module)
    }),
  ],
});

2. Migration

After adding the plugin (and especially after changing targetCollections), update your database schema:

yarn payload migrate:create
yarn payload migrate

(npm run / pnpm equivalents work too.)

Run migrate:create when new fields are added to collections (e.g. first time you list a slug in targetCollections). Then migrate to apply pending migrations.

Bootstrap a super admin: RBAC collections are restricted to super admins by default. Set isSuperAdmin: true on at least one user (via seed script, Local API, or direct database update) before you can manage roles, permissions, and the permission matrix in Admin.

→ COLLECTIONS — Bootstrap super admin

3. Seed RBAC data (Admin or script)

  1. permission-features — e.g. posts, users (code = featureCode in access helpers); use Reorder on the list view to set row order in the matrix
  2. permission-actions — e.g. create, read, update, delete (main / sub types); use Reorder to set main column and sub-action order
  3. permissions — one row per feature + action pair (status: active)
  4. roles — set dataScope; open update screen, configure matrix → Save
  5. users — assign roles; bootstrap isSuperAdmin via seed/API

→ Full reference: COLLECTIONS

4. Protect app collections

Recommended: list slugs in targetCollections — the plugin adds a hidden ownership field (createdBy text by default) and a create hook. You only wire getPermissionAccess on the collection. Full options → COLLECTIONS — targetCollections.

// payload.config.ts
payloadPluginRBAC({
  targetCollections: ["posts"],
});

// collections/posts.ts — no manual createdBy field or hook needed
import type { CollectionConfig } from "payload";
import { getPermissionAccess } from "@zealamic/payload-plugin-rbac";

export const Posts: CollectionConfig = {
  slug: "posts",
  access: {
    read: getPermissionAccess({ featureCode: "posts", actionCode: "read", options: {} }),
    create: getPermissionAccess({ featureCode: "posts", actionCode: "create" }),
    update: getPermissionAccess({ featureCode: "posts", actionCode: "update", mode: "modify" }),
    delete: getPermissionAccess({ featureCode: "posts", actionCode: "delete", mode: "modify" }),
  },
  fields: [{ name: "title", type: "text", required: true }],
};

After adding or changing targetCollections, run yarn payload migrate:create then yarn payload migrate.

Manual setup (visible fields, custom layout, or full control): add ownership field + create hook yourself → UTILS — Ownership field · relationship demo: dev/collections/posts.ts

Access order: no user → deny · super admin → allow · else → matrix permission (+ scope when options / mode: "modify").


Reorder overview (features & actions)

List views for permission-features and permission-actions include a Reorder drawer to set sortOrder (hidden on edit forms). Order drives the role permission matrix: features → rows, main actions → columns, sub actions → checkbox order under each row.

Sorted matrix

StepAction
FeaturesPermission Features → Reorder → drag → Save order
ActionsPermission Actions → Reorder → pick Main or Sub → drag → Save order

Reorder permission features Reorder permission actions

API: POST /api/permission-features/reorder · POST /api/permission-actions/reorder — body { "sortedItems": [{ "id": "…", "sortOrder": 0 }] }. Requires update access (super admin by default). Details → COLLECTIONS · labels → TRANSLATIONS — Reorder drawers.


Plugin options

OptionDefaultDescription
disabledfalseSkip runtime i18n/onInit wiring; collections still register in schema
autoModifyUsersCollectiontrueAdd RBAC fields, parent-path hooks, and default access on the auth users collection
targetCollections—Auto ownership field + create hook on listed app collections → COLLECTIONS
translations—Admin + matrix i18n → TRANSLATIONS
collections—Per-collection fields / access / admin overrides → COLLECTIONS
components.rolePermissionMatrixFielddefault client exportImport-map path to a custom matrix Field component (client module)

Types import from the main entry:

import type {
  RBACTranslations,
  PayloadPluginRBACConfig,
  TargetCollection,
} from "@zealamic/payload-plugin-rbac";

Exported helpers (summary)

Full reference: UTILS

FunctionPurpose
getPermissionAccessUnified access: permission-only, read Where, or modify per-document
targetCollections (plugin config)Quick ownership field + hook — COLLECTIONS
getCreatedByRelationshipField / createCreatedByOnCreateBeforeChangeHookManual ownership field + hook → UTILS
resolveUsersCollectionSlugSame admin.user → slug resolution as the plugin
getSuperAdminAccessSuper admin only (default on RBAC collections)
getAuthenticatedOrSuperAdminAccessOwner or super admin
canAccessDocumentByDataScopeLow-level single-document RBAC + scope check
resolveEffectiveDataScope / getHierarchyVisibleUserIdsScope resolution
getDataScopeReadWhere / mergeDataScopeWhereQuery filters
getMergedFieldAffectingData / getArrayOfMergedFieldAffectingDataField merge for overrides

Constants: CONSTANTS.ROLE.DATA_SCOPE, CONSTANTS.PERMISSION_ACTION.TYPE, etc.


Package exports

ImportContents
@zealamic/payload-plugin-rbacpayloadPluginRBAC, utils, constants, TypeScript types
@zealamic/payload-plugin-rbac/clientRolePermissionMatrixClient, PermissionActionReorderClient, PermissionFeatureReorderClient, createRolePermissionMatrixClient, and related types

Images from demo

demo-1

Reorder screenshots: Reorder overview above.


License

MIT


If this plugin helps your team ship safer access control with less friction, thank you for giving it a place in your stack.

Similar plugins