当用户配置文件拒绝访问子对象时,在Visualforce页面中使用apex:relatedList

时间:2012-04-20 14:54:53

标签: salesforce visualforce force.com

我有两个自定义对象,约会和会话报告。会话报告是标准主 - 详细信息关系中的约会的子项。此外,我有一个配置文件,学生,它具有对约会的读 - 创建 - 编辑 - 删除,没有会话报告的权限。用例是学生可以创建约会,但无法查看由导师为此约会创建的会话报告。

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

但是,在使用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渲染引擎可以找出它何时可以并且无法显示相关列表?

1 个答案:

答案 0 :(得分:3)

Salesforce安全模型只会确保您不会显示特定用户无法访问的数据。它是如何通过抛出你看到的异常来做到的。如果您正在构建自定义vf页面,则负责确保不显示用户不允许查看的内容。请注意,这与仅在用户没有正确的字段级别安全性时才显示的字段不同。

您需要添加一项检查以验证用户是否可以查看该对象。幸运的是,Describe Object Result上有很多“is”方法(isAccessible,isCreatable,isDeletable等),可以确定当前用户对该对象的权限,而无需在代码中硬编码配置文件。对于您的特定情况,如果无法访问该对象,则不显示该相关列表的内容。

Visualforce页面:

<apex:relatedList list="Session_Reports__r" 
                  rendered="{!$ObjectType.Session_Report__c.accessible}"/>