defineApplicationRole() 标记的角色的权限(参见下文的 默认函数角色)。
src/roles/restricted-company-role.ts
行级安全
对象和字段权限决定某个角色可以访问_哪些对象和字段_。 行级 权限谓词更进一步,决定某个角色可以查看和操作_哪些记录_——例如,一个自助式角色,其中每个外部用户只能看到自己的记录。 在角色上使用rowLevelPermissionPredicates 来声明谓词。 与清单的其余部分类似,
每个谓词都有自己的 universalIdentifier,并引用一个对象和一个字段(通过它们的 universalIdentifier)、一个 operand,以及(可选的)在查询时注入其值的 workspaceMember 字段——这样你就可以表达:“记录的所有者关系是当前的工作区成员”:
src/roles/partner-role.ts
将谓词与组组合使用
默认情况下,角色的谓词通过AND 进行组合。 要将其中一些谓词通过 OR 进行组合(或嵌套逻辑),请声明一个 rowLevelPermissionPredicateGroups 条目,并通过 predicateGroupUniversalIdentifier 将每个谓词指向该条目。 此角色允许合作伙伴查看其拥有或其是联系人的商机:
src/roles/partner-opportunities-role.ts
- 为每个谓词和组分配一个稳定的
universalIdentifier(任意 uuid)——它在各次升级中作为实体的键,谓词通过它来引用组。 - 谓词可以引用由你的应用拥有的对象和字段,或由 Twenty 的标准对象拥有的对象和字段。
- 行级安全会在包含该功能的套餐中的工作区上强制执行;在其他套餐中谓词仍会同步,只是不会被强制执行。
默认函数角色
当你使用脚手架创建新应用时,CLI 会创建一个使用defineApplicationRole() 声明的默认角色文件:
src/roles/default-role.ts
defineApplicationRole() 是 defineRole() 的一个轻量包装,它会标记在应用安装时用作应用默认角色的该角色。 验证与 defineRole 完全相同,但构建流水线会自动将其 universalIdentifier 注入到应用清单的 defaultRoleUniversalIdentifier 中——因此你无需在 defineApplication 中自行引用它。
备注:
- 每个应用只允许有且仅有 一个
defineApplicationRole(...)——如果发现多于一个,清单构建将失败。 - 对于你的应用随附的任何额外角色,请使用
defineRole()(而不是defineApplicationRole())。 - 在
defineApplication()上显式设置defaultRoleUniversalIdentifier仍然受支持以保持向后兼容性,但已经弃用,推荐使用defineApplicationRole()。
最佳实践
- 从脚手架生成的角色开始,然后逐步收紧它的权限——默认角色授予广泛的读取访问权限,而这在生产环境中很少是你想要的。
- 将
objectPermissions和fieldPermissions替换为你的函数实际需要的精确对象和字段。 permissionFlagUniversalIdentifiers控制对平台级能力的访问。 尽量保持最小化。- 查看一个可运行示例:
hello-world/src/roles/function-role.ts。