提供的能力
@nocobase/app-plugin-authorization 提供应用授权服务、权限集、页面和设置项权限,以及数据库字段、记录和关联访问策略。适合控制“谁能打开某个页面、执行某个业务操作、访问哪些数据”。
应用声明业务资源与管理界面,插件提供授权决策及可落实到查询中的数据策略。
配置权限
| 对象 | 控制内容 |
|---|---|
| 权限集 | 将一组授权分配给用户等主体 |
page | 页面访问,例如打开订单页 |
settings | 设置项的读取、创建、修改等管理操作 |
composite | 业务动作及其依赖的数据、字段和操作 |
database.collection | 已接入权限模型的 Collection 及其数据策略 |
资源和操作需要先由应用或插件声明,才能正确授权。业务 Collection 必须通过授权服务注册;单纯存在于数据库中不等于已接入权限模型。
默认配置的 root 权限集具有 unrestricted 权限,应与普通业务角色分开。当前实现将 Member 作为新建普通账号的显式角色分配,不能把它理解成所有登录用户永远隐式拥有的权限。
使用场景与示例
示例:订单查看与修改
- 应用声明“查看订单”和“修改订单”业务能力,明确所需字段与记录范围。
- 给客服角色授予查看,给订单负责人授予相应修改能力。
- 页面用路由
authz和useCan呈现入口、按钮;API 在服务端重新检查操作。 - 查询通过
authz.database.policyFor(...)或authorizeRepository(...)等公开接口落实记录与字段策略。 - 用不同角色检查列表、详情、关联数据和直接 API 请求。
只检查“有查看订单权限”后直接执行不受限制的数据库查询,会丢失记录和字段限制。菜单隐藏、按钮禁用也不能代替服务端授权。
开发提示词(交给当前应用目录中的 Coding Agent):
请使用权限管理插件,为订单增加查看与修改权限。
声明页面和业务操作,复用当前角色,不给普通用户追加 root 或无限制权限。
页面按权限显示按钮,服务端同时校验操作、记录与字段范围。
用只读、可修改和无权用户验证列表、详情、关联数据及直接 API 请求。完成标志:只读用户能读取允许订单但不能修改;其他记录和受限字段不会通过接口泄露。
重要原理与实现
以下是实现本例时的接入位置与预期界面变化;它们是开发说明,具体文件名沿用当前应用结构。
| 接入位置 | 代码或配置变化 | 界面与行为变化 |
|---|---|---|
| server/config/authorization.ts 与资源声明 | 注册业务 Collection、操作及字段依赖 | 管理页可选择真实业务能力 |
| 业务服务和 Repository 查询 | 应用授权返回的数据策略 | 列表、详情和写入遵循相同范围 |
| 页面路由与操作按钮 | 使用 authz、useCan,保留接口校验 | 页面入口和操作可见性符合角色 |
接入与入口
在身份认证之后注册 Client 和 Server 插件,执行迁移与种子数据。应用在 server/config/authorization.ts 中组合配置,通过 /server 的 authorizationToken 使用授权服务。
插件提供 /api/authorization 接口、AuthorizationClient 和 useCan 等客户端能力,不直接注册权限管理页面。应用接入自己的管理页,并声明可分配的业务能力。
数据范围扩展
需要统一或细化记录范围时,按业务分别配置:
这些规则不会创建操作权限。管理界面中的分组只是展示组织,也不会改变授权结果。相关安装操作见管理插件。
AI 开发的约束与验证
本插件的开发约束
- 声明业务能力后再授权,不能把未接入权限模型的数据库查询当作已受保护。
- 检查页面、操作、字段、记录与关联访问,避免一个布尔 can 判断后执行无限制查询。
- 用普通角色和直接 API 请求验收;涉及角色 Seed 时检查是否意外扩大现有用户权限。
上述检查是接入后的验收要求,不表示本文已完成运行验证。让 Agent 报告实际改动、执行过的检查和未验证项;项目指引、Skills 与通用检查流程见持续开发应用和测试。
源码依据:插件公开入口与实现。