10

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

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

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

4

6 回答 6

4

我在我的博客上写了一篇关于这个的文章。刚刚在 API 24.0 版(春季发布)中发布了一项功能,可让您在逐条记录的基础上为当前用户执行此操作。

这是该博客条目的链接,其中包含详细信息:如何判断用户是否有权访问记录

于 2012-05-10T17:48:52.247 回答
3

不要将记录级别访问与 CRUD 混淆 - 后者是用户创建读取更新删除对象的能力,而不管共享规则等可能会影响用户对特定记录的访问。

要检查用户是否可以创建(例如联系人),只需使用

Schema.sObjectType.Contact.isCreateable()

(返回truefalse

于 2013-09-25T22:04:45.697 回答
0

从文档。听起来您想匿名使用执行。

Apex 通常在系统上下文中运行;也就是说,在代码执行过程中不会考虑当前用户的权限、字段级安全性和共享规则。此规则的唯一例外是使用 executeAnonymous 调用执行的 Apex 代码。executeAnonymous 始终使用当前用户的完全权限执行。有关 executeAnonymous 的更多信息,请参阅匿名块。

虽然 Apex 默认不强制执行对象级和字段级权限,但您可以通过显式调用 sObject 描述结果方法(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

于 2012-05-09T14:06:29.950 回答
0

您是否尝试过runAs()方法?

类似的东西(未验证):

User u = [SELECT Id FROM User WHERE Name='John Doe'];

System.runAs(u) {
  if (Schema.sObjectType.Contact.fields.Email.isAccessible()) {
    // do something
  }
}
于 2012-05-09T14:19:01.207 回答
0

DescribeSObjectResult 类具有检查 CRUD 的方法。

例如,这允许您测试当前用户是否可以更新一般的帐户对象。

Schema.DescribeSObjectResult drSObj = Schema.sObjectType.Account;
Boolean thisUserMayUpdate = drSObj.isUpdateable();

@John De Santiago:您的文章涵盖了记录级别访问而不是对象 CRUD(= 对象级别访问)

于 2015-06-05T18:30:58.427 回答
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
于 2019-08-22T18:53:59.657 回答