如何在Salesforce中检查用户对对象的CRUD权限?

时间:2012-05-09 08:32:17

标签: permissions salesforce crud apex-code

根据要求,如果用户没有第三个对象的读取权限,我必须更改帐户的所有者。

我需要类似于描述字段结果的isAccessible()方法的功能,但它仅适用于当前登录的用户。

有没有其他方法可以检查用户对Apex代码中对象的CRUD权限?

6 个答案:

答案 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()

(返回truefalse

答案 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。

http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/apex_classes_perms_enforcing.htm#kanchor431

答案 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