1

我有两个自定义对象,约会和会话报告。会话报告是标准主从关系中 Appointment 的子项。此外,我有一个个人资料 Student,它对约会具有读取-创建-编辑-删除功能,而对会话报告没有权限。用例是学生可以创建约会,但无法查看导师为此约会创建的会话报告。

查看约会时,为约会对象使用标准布局可以按预期工作。即,学生可以看到约会字段,并且不会显示会话报告的相关列表。观察到的所有其他用户配置文件都可以看到会话报告的相关列表。

但是,在用 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"/>

这个新页面对至少对会话报告对象具有读取权限的所有用户都可以正常工作。学生用户对此对象无权并收到此错误消息

'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 等),您可以确定当前用户对该对象的权限是什么,而无需将配置文件硬编码到您的代码中。对于您的特定情况,如果对象不可访问,您不会显示该相关列表。

视觉力量页面:

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