【问题标题】:Using apex:relatedList in a Visualforce page when the user profile denies access to child objects当用户配置文件拒绝访问子对象时,在 Visualforce 页面中使用 apex:relatedList
【发布时间】:2012-04-20 14:54:52
【问题描述】:

我有两个自定义对象,约会和会话报告。会话报告是标准主从关系中 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"/>

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

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

显然这种关系确实存在,因为该页面可以为具有不同个人资料的用户正确显示。我一直无法解决标准布局和 VF 页面之间的差异,这会导致此失败。有人建议我可以在 VF 页面中识别用户配置文件并使用该信息来切换渲染。但是,这种方法违背了 Salesforce 安全模型的目的,我不会采用这种技术。

我应该能够以这种方式使用 apex:relatedList 吗?还是我错误地认为 VF 渲染引擎可以判断何时可以显示相关列表,何时不能显示相关列表?

【问题讨论】:

    标签: salesforce visualforce force.com


    【解决方案1】:

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

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

    Visualforce 页面:

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

    【讨论】:

    • 这正是我不想要的答案 - 你是对的,我继续发现在这个环境中工作很不愉快。我确实使用了另一种方法&lt;apex:relatedList list="Grades__r" rendered="{!$ObjectType.Grade__c.accessible}"/&gt;,它也有效。
    • 当我的 Visualforce 页面中的答案正确时,我一直在思考为什么这个解决方案如此令人不快。也就是说,当我使用这个标签 &lt;apex:outputField value="{!Tutor__c.Notes__c}"/&gt; 并且 Notes__c 字段对用户配置文件不可见时......它只是没有显示在页面上。我不需要做任何事情来实现这一点。没有测试 isAccessible,什么都没有。这可能是我偏向于原始标记的原因。
    • 很不错,你可以通过删除 is 来访问 isAccessible。更新了答案。我认为您应该自动处理这一事实,但最好尽早与销售人员一起克服这种期望。如果他们在第一次尝试时没有做好,他们就不会回来清理功能以使其更容易。即使它完全坏了,也不能保证它会得到 QA 的关注
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2013-07-17
    • 2011-08-03
    • 1970-01-01
    • 2014-06-03
    • 2019-03-23
    • 2013-11-21
    相关资源
    最近更新 更多