Salesforce:如果当前用户有权更新当前记录,如何仅呈现顶点。记录级别的安全性

Posted

技术标签:

【中文标题】Salesforce:如果当前用户有权更新当前记录,如何仅呈现顶点。记录级别的安全性【英文标题】:Salesforce: How to only render apex if current user has permission to update current record. Record level security 【发布时间】:2011-06-16 03:52:41 【问题描述】:

我正在尝试修复我为这个问题发布的代码VisualForce: convert carriage returns to html line-breaks in a long text field

正如您在该帖子中看到的那样,Visualforce 页面有一个自定义控制器,其中包含 Case 的选项卡式内容。列出 CaseComments 的唯一方法是使用自定义 Apex。控制器执行一个简单的查询来检索当前案例的所有 CaseComments。

如果当前用户有权编辑特定案例评论的实例,我只想显示“编辑”链接。

我在这里找到了一篇关于基于对象级安全性动态渲染组件的好博客: http://forcearchitects.deliveredinnovation.com/2011/02/05/render-visualforce-components-dynamically-based-on-object-level-security/

根据我尝试使用的帖子

$ObjectType.CaseComment.updateable

如下:

<apex:repeat value="!comments" var="c">
    <tr>
    <td class="commentsActionColumn">
    <!-- open the case comment for edit -->
    <apex:outputLink title=""
        rendered="!$ObjectType.CaseComment.updateable" 
    value="/!c.id/e?parent_id=!c.parentId&retURL=/apex/!$CurrentPage.Name%3Fid=!case.id" style="font-weight:bold">Edit</apex:outputLink> 
    </td>
    <td>
    <!-- display the case comment formatted using the apex outputField -->
    <div class="commentTdClass">
    <apex:outputField value="!c.commentbody"></apex:outputField>
    </div>
    </td>
    </tr>
</apex:repeat>

不幸的是,可更新测试是在对象级别上进行的,因此如果当前用户有权编辑任何 CaseComment,它会在所有 CaseComment 上返回 true。

如果当前用户可以修改特定行,我需要记录级别验证以仅显示编辑操作。

有什么想法吗?

更新 当我重新阅读我的问题时,我发现它并没有应该的那么清楚。

当我遍历 CaseComment 集时,对于给定的 Case,我需要知道当前用户是否可以安全地编辑特定 CaseComment 而不会看到“您没有权限页面”。此测试必须在 CaseComment by CaseComment 记录级别的基础上进行,因为任何给定的案例都会有许多不同用户贡献的 CaseComment

【问题讨论】:

【参考方案1】:

您可以通过多种方式做到这一点(我认为)。

如果您想走纯编程路线,那么look here 讨论了使用共享对象来允许与特定用户或组共享记录。

否则,如果可能的话,您可以使用角色和层次管理来组织它,以便只有特定级别或更高级别的特定角色中的人才能看到并访问记录?

保罗

更新:

根据您在下面的评论,我认为您想使用 apex 共享。如果您查看this useful developerforce wiki,您可以看到您应该访问共享对象以检查用户在此对象中是否有记录以查看特定的记录实例。比如:

MyObject__Share share1 = [Select ParentId, UserOrGroupId, AccessLevel from MyObject__Share where ParentId = :myrecordId And UserOrGroupId = :UserId];
if(share1 != null)
 code to allow the record to be viewed
else
code to deny access

我还没有测试或尝试过,所以你会想要调整它,但这应该是一般的想法。

保罗

【讨论】:

感谢您的回答。我可能用我表达我的问题的方式误导了你(对我来说很正常)。问题不在于对象级别,而在于记录级别权限。我不想创建规则来共享案例的所有 CaseComments。我只想知道当前用户是否可以安全地编辑 CaseComment 而不会看到“您没有权限页面”。这是在 CaseComment by CaseComment 记录级别的基础上进行的,因为任何给定的案例都会有许多由不同用户贡献的 CaseComment。这更清楚了吗? 更新了答案,如果有帮助请告诉我。老实说,这对我来说是一个新领域,但它应该可以工作。【参考方案2】:

看看下面的网址。

https://developer.salesforce.com/forums/?id=906F00000008w0gIAA

看起来我们可以使用类似下面的东西。但是我还没有测试。

SELECT RecordId, [HasReadAccess, HasEditAccess, HasAllAccess, MaxAccessLevel] FROM UserRecordAccess
WHERE UserId = [single ID]
AND RecordId = [single ID] 
//or Record IN [list of IDs]

【讨论】:

以上是关于Salesforce:如果当前用户有权更新当前记录,如何仅呈现顶点。记录级别的安全性的主要内容,如果未能解决你的问题,请参考以下文章

salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

更新后崩溃(转移iOS App的所有权)

根据子表中的“当前”值过滤 belongsToMany 记录

如果 salesforce 中有多个经理,则限制经理与其下属之间的记录级别访问权限

Salesforce 执行顺序

更新用户对象时 Salesforce Apex 触发器中的 MIXED_DML_OPERATION 错误