1

アポイントメントとセッションレポートの2つのカスタムオブジェクトがあります。セッションレポートは、標準のマスターと詳細の関係にあるアポイントメントの子です。さらに、プロファイルStudentがあります。このプロファイルには、予定の読み取り、作成、編集、削除があり、セッションレポートの権限はありません。ユースケースは、学生はアポイントメントを作成できますが、チューターがこのアポイントメント用に作成したセッションレポートを表示できない場合です。

Appointmentオブジェクトに標準レイアウトを使用すると、Appointmentsを表示するときに期待どおりに機能します。つまり、学生は予定フィールドを見ることができ、セッションレポートの関連リストは表示されません。監視する他のすべてのユーザープロファイルは、セッションレポートの関連リストを表示できます。

ただし、標準レイアウトをVisualforceページ自体に置き換えるときに問題が発生しました。

<apex:page standardController="Appointment__c">
<apex:sectionHeader title="{!$ObjectType.Appointment__c.label}" subtitle="{!Appointment__c.Name}"/>
<apex:pageBlock title="{!$ObjectType.Appointment__c.label} Detail">
    <apex:pageBlockSection showHeader="false" columns="1">
        <apex:outputField value="{!Appointment__c.Tutor_Name__c}"/>
        <apex:outputField value="{!Appointment__c.Student_Name__c}"/>           
    </apex:pageBlockSection>
 </apex:pageBlock>    
 <apex:relatedList list="Session_Reports__r"/>

この新しいページは、少なくともセッションレポートオブジェクトの読み取り権限を持つすべてのユーザーに対して期待どおりに機能します。Studentユーザーにはこのオブジェクトに対する権限がなく、このエラーメッセージを受け取ります

'Session_Reports__r' is not a valid child relationship name for entity Appointment 

異なるプロファイルを持つユーザーに対してページを適切に表示できるため、明らかにこの関係が存在します。この失敗の原因となる標準レイアウトとVFページの違いを解決できませんでした。VFページでユーザープロファイルを識別し、その情報を使用してレンダリングを切り替えることができると私に提案されました。ただし、このタイプのアプローチはSalesforceセキュリティモデルの目的を損なうため、このような手法は採用しません。

この方法でapex:relatedListを使用できるようにする必要がありますか?または、VFレンダリングエンジンが関連リストを表示できる場合とできない場合を判断できると誤って想定していましたか?

4

1 に答える 1

3

Salesforceのセキュリティモデルは、特定のユーザーがアクセスできないデータを表示しないようにするだけです。これを行う方法は、表示される例外をスローすることです。カスタムvfページを作成している場合は、ユーザーに表示を許可されていないものを表示しないようにする責任があります。これは、ユーザーが適切なフィールドレベルのセキュリティを持っていない場合に表示されないフィールドの場合とは異なることに注意してください。

ユーザーがそのオブジェクトを表示できることを確認するためのチェックを追加する必要があります。幸い、 Describe Object Resultには多くの「is」メソッド(isAccessible、isCreatable、isDeletableなど)があり、プロファイルをコードにハードコーディングしなくても、そのオブジェクトに対する現在のユーザーのアクセス許可を判別できます。特定のケースでは、オブジェクトにアクセスできない場合、その関連リストを何を表示するかはわかりません。

Visualforceページ:

<apex:relatedList list="Session_Reports__r" 
                  rendered="{!$ObjectType.Session_Report__c.accessible}"/>
于 2012-04-21T19:41:45.270 に答える