.agents/skills/support/permission/add-permission/reference/permission-class.md
// packages/global/support/permission/controller.ts
export class Permission {
role: PermissionValueType;
private permission: PermissionValueType;
// 权限状态(计算属性)
isOwner: boolean;
hasManagePer: boolean;
hasWritePer: boolean;
hasReadPer: boolean;
// 角色状态
hasManageRole: boolean;
hasWriteRole: boolean;
hasReadRole: boolean;
constructor({ role, isOwner, roleList, perList, rolePerMap }) {
this.role = isOwner ? OwnerRoleVal : role;
this.updatePermissions();
}
// 检查是否拥有指定权限
checkPer(perm: PermissionValueType): boolean {
if (perm === OwnerPermissionVal) {
return this.permission === OwnerPermissionVal;
}
return (this.permission & perm) === perm;
}
// 添加角色
addRole(...roleList: RoleValueType[]) {
for (const role of roleList) {
this.role = this.role | role;
}
this.updatePermissions();
return this;
}
}
permission 字段存的是 role 值,通过 rolePerMap 展开成实际权限isOwner=true,role 直接设为 OwnerRoleValaddRole 返回 this,支持链式操作// packages/global/support/permission/{resource}/controller.ts
import { Permission, PerConstructPros } from '../controller';
import {
{Resource}RoleList,
{Resource}RolePerMap,
{Resource}PerList,
{Resource}DefaultRoleVal
} from './constant';
export class {Resource}Permission extends Permission {
constructor(props?: PerConstructPros) {
// 处理空参数
if (!props) {
props = { role: {Resource}DefaultRoleVal };
} else if (!props.role) {
props.role = {Resource}DefaultRoleVal;
}
// 注入资源特定的配置
props.roleList = {Resource}RoleList;
props.rolePerMap = {Resource}RolePerMap;
props.perList = {Resource}PerList;
super(props);
}
}
const per = new DatasetPermission({ role: WriteRoleVal });
per.hasReadPer; // true(write 包含 read)
per.hasWritePer; // true
per.hasManagePer; // false
per.isOwner; // false
per.checkPer(ReadPermissionVal); // true
per.checkPer(ManagePermissionVal); // false
const Per = new {Resource}Permission({
role: myPer,
isOwner: String(resource.tmbId) === String(tmbId)
});
if (!Per.checkPer(per)) {
return Promise.reject({Resource}ErrEnum.unAuth);
}
// 返回给调用方
return {
permission: Per,
{resource}: resource
};
import { sumPer } from '@fastgpt/global/support/permission/utils';
// 合并父级权限和自身权限
const Per = new {Resource}Permission({
role: sumPer(folderPer, myPer),
isOwner
});
| 类 | 文件 |
|---|---|
Permission | packages/global/support/permission/controller.ts |
DatasetPermission | packages/global/support/permission/dataset/controller.ts |
AppPermission | packages/global/support/permission/app/controller.ts |
TeamPermission | packages/global/support/permission/user/controller.ts |