Salesforce:如果当前用户有权更新当前记录,如何只渲染顶点。记录级安全性

时间:2011-06-16 03:52:41

标签: salesforce apex-code visualforce user-permissions

我正在尝试修复针对此问题发布的代码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>

不幸的是,updateable的测试是在Object级别上,因此如果当前用户有权编辑任何CaseComment,它将在所有CaseComments上返回true。

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

有什么想法吗?

更新 当我重新阅读我的问题时,我发现它并不像它应该的那样清晰。

当我迭代CaseComments集合时,对于给定的Case,我需要知道当前用户是否可以安全地编辑特定的CaseComment而不会看到“您没有权限页面”。此测试必须基于CaseComment by CaseComment记录级别,因为任何给定的案例都会有许多CaseComments,所有CaseComments都由不同的用户提供

2 个答案:

答案 0 :(得分:1)

你可以用两种方式做到这一点(我认为)。

如果你想沿着纯粹的程序化路线走,那么look here讨论使用共享对象来允许与特定用户或群组共享记录。

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

更新

根据您的评论,我认为您希望使用顶级共享。如果查看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}

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

答案 1 :(得分:0)

查看以下网址。

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]