根据要求,如果用户没有第三个对象的读取权限,我必须更改帐户的所有者。
我需要类似于描述字段结果的isAccessible()
方法的功能,但它仅适用于当前登录的用户。
有没有其他方法可以检查用户对Apex代码中对象的CRUD权限?
答案 0 :(得分:4)
我在博客上写了一篇关于此的文章。有一个功能刚刚在API(Spring Release)的24.0版本中发布,它将允许您在当前用户的记录基础上执行此操作。
以下是该博客条目的详细信息链接:How to tell if a user has access to a record
答案 1 :(得分:2)
不要将记录级别访问与CRUD混淆 - 后者是用户创建,读取,更新或<的能力strong>删除一般对象,无论共享规则等是否可能影响用户对特定记录的访问权。
要检查用户是否可以创建(例如通讯录),只需使用
Schema.sObjectType.Contact.isCreateable()
(返回true
或false
)
答案 2 :(得分:0)
从文档中。听起来你想匿名使用执行。
Apex通常在系统环境中运行;也就是说,在代码执行期间不考虑当前用户的权限,字段级安全性和共享规则。此规则的唯一例外是使用executeAnonymous调用执行的Apex代码。 executeAnonymous始终使用当前用户的完全权限执行。有关executeAnonymous的更多信息,请参阅匿名块。
虽然Apex默认情况下不强制执行对象级和字段级权限,但您可以通过显式调用sObject describe结果方法(Schema.DescribeSObjectResult)和字段描述结果方法(在Schema.DescribeFieldResult)检查当前用户的访问权限级别。通过这种方式,您可以验证当前用户是否具有必要的权限,并且只有当他或她具有足够的权限时,您才能执行特定的DML操作或查询。
例如,您可以调用Schema.DescribeSObjectResult的isAccessible,isCreateable或isUpdateable方法来验证当前用户是否分别具有对sObject的读取,创建或更新访问权限。同样,Schema.DescribeFieldResult公开了这些访问控制方法,您可以调用这些方法来检查当前用户对字段的读取,创建或更新访问。此外,您可以调用Schema.DescribeSObjectResult提供的isDeletable方法来检查当前用户是否有权删除特定的sObject。
答案 3 :(得分:0)
您是否尝试过runAs()方法?
类似(未经验证):
User u = [SELECT Id FROM User WHERE Name='John Doe'];
System.runAs(u) {
if (Schema.sObjectType.Contact.fields.Email.isAccessible()) {
// do something
}
}
答案 4 :(得分:0)
DescribeSObjectResult类具有检查CRUD的方法。
E.g。这允许您测试当前用户是否可以更新帐户对象。
Schema.DescribeSObjectResult drSObj = Schema.sObjectType.Account;
Boolean thisUserMayUpdate = drSObj.isUpdateable();
@John De Santiago:您的文章涵盖了记录级访问,而不是对象CRUD(=对象级访问)
答案 5 :(得分:0)
非常旧的帖子。从那时起,SF添加选项以查询对象权限:
Select SobjectType ,ParentId, PermissionsEdit, PermissionsRead
From ObjectPermissions
Order by ParentID, SobjectType ASC
基本上,您将需要获取要检查的用户的配置文件和权限集以及相关对象。所以会是这样:
Select SobjectType ,ParentId, PermissionsEdit, PermissionsRead
From ObjectPermissions
where parentId IN :UserProfileIdAndPermission
AND sObjectType=:objectType
Order by ParentID, SobjectType ASC