自定义权限(Custom Permission)
Salesforce默认提供了多种方式设定用户的权限,比如简档、权限集等。在这些设定中,已经包括了系统中的对象、应用、字段、页面布局等组件,管理员或开发者只需要设定权限等级即可。
当管理员或开发者需要设定更灵活的权限时,上面的方法便可能无法满足。为了解决这个问题,Salesforce提供了自定义权限(Custom Permission),让管理员或开发者可以设定完全自定义的权限,然后根据这些权限设定灵活决定各个组件的权限。
自定义权限的设定
在设置界面搜索“自定义权限”,点击“自定义权限”链接,即可进入自定义权限一览表。
点击新建按钮,即可新建自定义权限。
从截图中可以看到,自定义权限和简档、权限集等不同,没有各种组件的权限设定,而是只有基本的几个属性。用户在设定这些属性值以后,一个自定义权限就添加完成了。
但是自定义权限不能单独分配给用户,而是要包含在简档或权限集中,相当于它们的一个组成部分。
自定义权限的使用
和简档、权限集不同,自定义权限本身并不包含对任何组件的任何权限设定。它就像一张空白的通行证,能通向哪里需要管理员或开发者来灵活设定。
自定义权限可以在多种情况下使用。现在假设系统中已经添加了一个名称为“Example_CP”的自定义权限。
验证规则
在创建验证规则时,需要在“错误条件公式”中插入各种条件。自定义权限便可以在此处使用。
比如:当用户没有名为“Example_CP”的自定义权限时,验证规则失败。那么可以在“错误条件公式”中这样写:“NOT($Permission.Example_CP)”。这样,当进行验证的用户没有被分配“Example_CP”自定义权限时,验证失败。
数据库查询
在SOQL中,可以使用CustomPermission和其他相关对象来查询自定义权限相关的信息。
比如:
-- 查询所有包含了Example_CP自定义权限的权限集
SELECT Id, DeveloperName,
(select Id, Parent.Name, Parent.Profile.Name from SetupEntityAccessItems)
FROM CustomPermission
WHERE DeveloperName = \'Example_CP\'
-- 查询所有包含任意自定义权限的简档和权限集
SELECT Assignee.Name, PermissionSet.Id,
PermissionSet.Profile.Name,
PermissionSet.isOwnedByProfile,
PermissionSet.Label
FROM PermissionSetAssignment
WHERE PermissionSetId
IN (SELECT ParentId
FROM SetupEntityAccess
WHERE SetupEntityType = \'CustomPermission\')
-- 查询ID是userId变量的值的用户所拥有的权限
SELECT SetupEntityId
FROM SetupEntityAccess
WHERE SetupEntityType=\'CustomPermission\'
AND ParentId IN
(SELECT PermissionSetId
FROM PermissionSetAssignment
WHERE AssigneeId=:userId)