自定义角色
角色体系
| 角色 | 来源 | 说明 |
|---|---|---|
owner | 系统内置 | 组织创建者,不可更改、不可转让 |
member | 系统内置 | 默认角色 |
| 自定义 | 配置文件 | 开发者定义的额外角色 |
配置文件
在 api/src/config/website/tenant.{suffix}.ts 中定义:
import type { TenantConfig } from "@readystart/api-core"
export const getTenantConfig = (): TenantConfig => ({
roles: [
{ value: "admin", label: "管理员" },
{ value: "editor", label: "编辑" },
{ value: "viewer", label: "查看者" },
]
})
规则
value:只能用小写字母、数字、_、-label:显示名称,支持中文- 不能使用
owner和member(自动过滤) value和label都不能为空(自动过滤)
前端表现
邀请时
- 只有
member一个角色 → 不显示角色选择 - 有自定义角色 → 弹框出现下拉选择(不含 owner)
成员管理
- 操作菜单显示可切换的角色(排除当前角色和 owner)
- 角色列显示
label(如”管理员”),不是value
后端校验
三层保护:
- 配置加载:过滤非法 value、保留字
- validateRole:Controller 层校验角色是否在配置列表中
- Service 层:
role === 'owner'兜底拦截
// Controller 中
private async validateRole(role: string) {
const roles = await getTenantRoles()
const allowed = roles.filter(r => r.value !== 'owner').map(r => r.value)
if (!allowed.includes(role)) {
throw new ForbiddenException(`Invalid role: ${role}`)
}
}
在业务代码中使用
// 检查是否有某个角色
if (req.tenant?.role === 'admin' || req.tenant?.role === 'owner') {
// 有管理权限
}
// 菜单中按角色过滤
{ index: "/reports", title: "Reports", icon: FileText, tenantRoles: ["owner", "admin"] }