[PR #6536] feat(admin): dynamic access control #6730

Open
opened 2026-03-13 13:09:42 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/better-auth/better-auth/pull/6536
Author: @jslno
Created: 12/4/2025
Status: 🔄 Open

Base: canaryHead: 12-04-2025/admin-dynamic-ac


📝 Commits (10+)

📊 Changes

17 files changed (+2471 additions, -255 deletions)

View changed files

📝 docs/content/docs/plugins/admin.mdx (+306 -0)
📝 packages/better-auth/src/plugins/access/access.ts (+4 -0)
📝 packages/better-auth/src/plugins/access/types.ts (+8 -0)
📝 packages/better-auth/src/plugins/admin/access/statement.ts (+3 -0)
📝 packages/better-auth/src/plugins/admin/admin.ts (+112 -19)
packages/better-auth/src/plugins/admin/call.ts (+23 -0)
📝 packages/better-auth/src/plugins/admin/client.ts (+92 -4)
📝 packages/better-auth/src/plugins/admin/error-codes.ts (+12 -0)
📝 packages/better-auth/src/plugins/admin/has-permission.ts (+65 -24)
packages/better-auth/src/plugins/admin/permission.ts (+51 -0)
packages/better-auth/src/plugins/admin/routes/crud-access-control.test.ts (+606 -0)
packages/better-auth/src/plugins/admin/routes/crud-access-control.ts (+855 -0)
📝 packages/better-auth/src/plugins/admin/routes/index.ts (+208 -149)
📝 packages/better-auth/src/plugins/admin/schema.ts (+60 -37)
📝 packages/better-auth/src/plugins/admin/types.ts (+53 -12)
📝 packages/better-auth/src/plugins/index.ts (+11 -0)
📝 packages/better-auth/src/plugins/organization/routes/crud-access-control.ts (+2 -10)

📄 Description

Ported dynamic access control from organizations to admin plugin

closes #4557


Summary by cubic

Adds dynamic access control to the admin plugin with role CRUD APIs backed by the database. Enables creating, reading, updating, and deleting roles at runtime with strict permission checks and normalized role names.

  • New Features

    • Role CRUD endpoints (create, read get/list, update, delete) gated by dynamicAccessControl.enabled.
    • Permission checks load dynamic roles from DB; optional in-memory cache per user.
    • Client-side hasPermission helper and adminClient typing for dynamic roles; inferAdminAdditionalFields for client schema.
    • Role names normalized to lowercase.
    • Support for type-safe additional role fields; server-only fields respected.
    • New admin middleware ensures authenticated requests.
    • Expanded error codes for AC operations.
    • Default statements include “ac” resource with CRUD + read-own actions.
    • setRole accepts dynamic roles and validates them against the DB.
    • Tests for dynamic access control CRUD.
  • Migration

    • Provide a pre-defined AccessControl instance to the server admin plugin and enable dynamicAccessControl.
    • Run a DB migration to add the role table.
    • Update adminClient to pass ac, roles, and dynamicAccessControl.enabled.
    • Expect role names to be stored/handled in lowercase.
    • Optionally define schema.role.additionalFields for custom role fields (client can infer via inferAdminAdditionalFields).

Written for commit cbdba1c4b4. Summary will update on new commits.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/better-auth/better-auth/pull/6536 **Author:** [@jslno](https://github.com/jslno) **Created:** 12/4/2025 **Status:** 🔄 Open **Base:** `canary` ← **Head:** `12-04-2025/admin-dynamic-ac` --- ### 📝 Commits (10+) - [`117cc1e`](https://github.com/better-auth/better-auth/commit/117cc1ec8164083378debc02c57e9e40ba506cfa) chore: re-export zod types in plugins - [`0415792`](https://github.com/better-auth/better-auth/commit/0415792e64e1fafdb12b36bf930845875d685916) feat(admin): dynamic access control - [`5d4ac38`](https://github.com/better-auth/better-auth/commit/5d4ac384e92569845439e4f6961c2c18349ad0f0) chore: resolve conflicts - [`5a1c7c8`](https://github.com/better-auth/better-auth/commit/5a1c7c8a86882967a0b3099e35eb2683e94b38da) chore: fix types & linting - [`ba7bc98`](https://github.com/better-auth/better-auth/commit/ba7bc9811349b7e15f81dc0a80961c951fbd67e9) chore: update tests - [`fdc6411`](https://github.com/better-auth/better-auth/commit/fdc6411c52a14585f2a05a54206bbbfb576c1436) chore: cleanup - [`d50d510`](https://github.com/better-auth/better-auth/commit/d50d510121b317849ae8b3bbbc7599fb8cafff6f) chore: update docs - [`f8279bc`](https://github.com/better-auth/better-auth/commit/f8279bc71530c56176b4e23be9a4d2e77c2d97d8) Merge branch 'canary' of https://github.com/better-auth/better-auth into 12-04-2025/admin-dynamic-ac - [`cfbcb8d`](https://github.com/better-auth/better-auth/commit/cfbcb8df0984549649494057e670268fce9af9a3) chore: cleanup - [`440dbc1`](https://github.com/better-auth/better-auth/commit/440dbc1b460c8a129fce5a19324734165e8ec79a) chore: cleanup ### 📊 Changes **17 files changed** (+2471 additions, -255 deletions) <details> <summary>View changed files</summary> 📝 `docs/content/docs/plugins/admin.mdx` (+306 -0) 📝 `packages/better-auth/src/plugins/access/access.ts` (+4 -0) 📝 `packages/better-auth/src/plugins/access/types.ts` (+8 -0) 📝 `packages/better-auth/src/plugins/admin/access/statement.ts` (+3 -0) 📝 `packages/better-auth/src/plugins/admin/admin.ts` (+112 -19) ➕ `packages/better-auth/src/plugins/admin/call.ts` (+23 -0) 📝 `packages/better-auth/src/plugins/admin/client.ts` (+92 -4) 📝 `packages/better-auth/src/plugins/admin/error-codes.ts` (+12 -0) 📝 `packages/better-auth/src/plugins/admin/has-permission.ts` (+65 -24) ➕ `packages/better-auth/src/plugins/admin/permission.ts` (+51 -0) ➕ `packages/better-auth/src/plugins/admin/routes/crud-access-control.test.ts` (+606 -0) ➕ `packages/better-auth/src/plugins/admin/routes/crud-access-control.ts` (+855 -0) 📝 `packages/better-auth/src/plugins/admin/routes/index.ts` (+208 -149) 📝 `packages/better-auth/src/plugins/admin/schema.ts` (+60 -37) 📝 `packages/better-auth/src/plugins/admin/types.ts` (+53 -12) 📝 `packages/better-auth/src/plugins/index.ts` (+11 -0) 📝 `packages/better-auth/src/plugins/organization/routes/crud-access-control.ts` (+2 -10) </details> ### 📄 Description Ported dynamic access control from organizations to admin plugin closes #4557 <!-- This is an auto-generated description by cubic. --> --- ## Summary by cubic Adds dynamic access control to the admin plugin with role CRUD APIs backed by the database. Enables creating, reading, updating, and deleting roles at runtime with strict permission checks and normalized role names. - **New Features** - Role CRUD endpoints (create, read get/list, update, delete) gated by dynamicAccessControl.enabled. - Permission checks load dynamic roles from DB; optional in-memory cache per user. - Client-side hasPermission helper and adminClient typing for dynamic roles; inferAdminAdditionalFields for client schema. - Role names normalized to lowercase. - Support for type-safe additional role fields; server-only fields respected. - New admin middleware ensures authenticated requests. - Expanded error codes for AC operations. - Default statements include “ac” resource with CRUD + read-own actions. - setRole accepts dynamic roles and validates them against the DB. - Tests for dynamic access control CRUD. - **Migration** - Provide a pre-defined AccessControl instance to the server admin plugin and enable dynamicAccessControl. - Run a DB migration to add the role table. - Update adminClient to pass ac, roles, and dynamicAccessControl.enabled. - Expect role names to be stored/handled in lowercase. - Optionally define schema.role.additionalFields for custom role fields (client can infer via inferAdminAdditionalFields). <sup>Written for commit cbdba1c4b4fec88f61ad3dff7968d630e2ab1e1b. Summary will update on new commits.</sup> <!-- End of auto-generated description by cubic. --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-03-13 13:09:42 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#6730