0

この質問に投稿されたコードを修正しようとしています

その投稿でわかるように、Case のタブ付きコンテンツを含む Visualforce ページのカスタム コントローラーがあります。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 のテストはオブジェクト レベルで行われるため、現在のユーザーが任意の CaseComment を編集する権限を持っている場合、すべての CaseComments で true が返されます。

現在のユーザーが特定の行を変更できる場合にのみ編集アクションを表示するには、レコード レベルの検証が必要です。

何か案は?

更新 質問を読み直したところ、本来あるべきほど明確ではなかったことがわかりました。

CaseComments のセットを反復処理するとき、特定の Case について、現在のユーザーが「権限のないページ」を表示せずに特定の CaseComment を安全に編集できるかどうかを知る必要があります。このテストは、CaseComment ごとに CaseComment レコード レベルで行う必要があります。これは、特定の Case には、すべてが異なるユーザーによって提供された多数の CaseComment があるためです。

4

2 に答える 2

1

これはいくつかの方法で行うことができます(私は思います)。

純粋にプログラム的なルートをたどりたい場合は、共有オブジェクトを使用して特定のユーザーまたはグループとレコードを共有できるようにする方法について説明しているここを参照してください。

それ以外の場合は、可能であれば、役割と階層の管理を使用して、特定のレベル以上の特定の役割内のユーザーのみがレコードを表示してアクセスできるようにこれを整理できますか?

ポール

アップデート:

以下のコメントに基づいて、apex共有を使用したいと思います。この便利なdeveloperforcewikiを見ると、共有オブジェクトにアクセスして、特定のレコードインスタンスを表示するためにユーザーがこのオブジェクトにレコードを持っているかどうかを確認する必要があることがわかります。何かのようなもの:

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}

私はそれをテストまたは試したことがないので、あなたはそれを微調整したいと思うでしょうが、それは一般的な考えであるはずです。

ポール

于 2011-06-16T15:26:49.377 に答える
0

下のURLを見てください。

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]
于 2017-11-21T12:14:04.540 に答える