【问题标题】:Custom Salesforce Lightning App giving "You dont have access to this record"自定义 Salesforce Lightning 应用程序提供“您无权访问此记录”
【发布时间】:2020-10-06 01:08:35
【问题描述】:

名为“堆栈”的自定义 Lightning 应用程序给出“您无权访问此记录联系人” 尝试按照How To Implement Full Search in Case Type using Salesforce?中的步骤进行操作

这是自定义对象 ERT 案例类型数据的组织范围默认值

这里是stack.aspx的Apex代码

                public class Stack {
                      @AuraEnabled(cacheable=true)
                    public static List<LookupSearchResult> search(String searchTerm, List<String> selectedIds){
                        if(String.isBlank(searchTerm) || searchTerm.length() < 2){
                            return null;
                        }
                        String t = '%' + searchTerm + '%'; // decide how you want to search, "starts with", "includes" or what
                        
                        List<ERT_Case_Type_Data__c> records = [SELECT Id, Name, Level_1__c, Level_2__c, Level_3__c
                            FROM ERT_Case_Type_Data__c
                            WHERE Level_1__c LIKE :t OR Level_2__c LIKE :t OR Level_3__c LIKE :t
                            ORDER BY Level_1__c, Level_2__c, Level_3__c
                            LIMIT 20];
                        
                        /* You could also experiment with SOSL?
                        records =  [FIND :('*' + searchTerm + '*') IN ALL FIELDS 
                            RETURNING Case_Type_Data__c(Id, Name, Level_1__c, Level_2__c, Level_3__c)][0];
                        */
                        
                        List<LookupSearchResult> results = new List<LookupSearchResult>();
                        for(ERT_Case_Type_Data__c ctd : records){
                            results.add(new LookupSearchResult(ctd.Id, 'ERT_Case_Type_Data__c', 'standard:case_wrap_up', ctd.Name,
                                String.join(new List<String>{ctd.Level_1__c , ctd.Level_2__c, ctd.Level_3__c}, '; ')
                            ));
                        }
                        return results;
                    } 

                }

这里是Aura组件(html部分)

                <aura:component implements="force:hasRecordId,force:appHostable,flexipage:availableForAllPageTypes,force:lightningQuickAction" access="global" controller="Stack">
                    <aura:attribute access="global" type="List" name="selection" default="[]"/>
                    <aura:attribute access="global" type="List" name="errors" default="[]"/>

                    <lightning:card title="New Case Type">
                        
                        <lightning:recordEditForm aura:id="myForm" objectApiName="ERT_Case_Type__c" onsubmit="{!c.onSubmit}" onsuccess="{!c.onSuccess}">
                        <lightning:messages />
                        <c:Lookup selection="{!v.selection}" onSearch="{!c.lookupSearch}" onSelection="{!c.useSelected}" errors="{!v.errors}" label="Search" placeholder="Search Case Types Data"/>
                        <lightning:inputField aura:id="Level_1__c" fieldName="Level_1__c" />
                        <lightning:inputField aura:id="Level_2__c" fieldName="Level_2__c" />
                        <lightning:inputField aura:id="Level_3__c" fieldName="Level_3__c" />
                        <lightning:button class="slds-m-top_small" variant="brand" type="submit" name="save" label="Save" />
                    </lightning:recordEditForm>
                    </lightning:card>
                </aura:component>

这里是 Aura 组件 - JS 控制器部分

({
    lookupSearch : function(component, event, helper) {
    // Get the lookup component that fired the search event
    const lookupComponent = event.getSource();
    const serverSearchAction = component.get('c.search');
    lookupComponent.search(serverSearchAction);
},

useSelected: function(component, event, helper) {
    const selection = component.get('v.selection');
    const errors = component.get('v.errors');
    
    if (selection.length) {
        if(errors.length){  // Clear errors, if any
            component.set('v.errors', []);
        }
        let levels = selection[0].subtitle.split('; ');
        component.find('Level_1__c').set('v.value', levels[0]);
        component.find('Level_2__c').set('v.value', levels[1]);
        component.find('Level_3__c').set('v.value', levels[2]);
    }
},
onSubmit: function(component, event, helper) {
    debugger;
    event.preventDefault();       // stop the form from submitting
    var fields = event.getParam('fields');
    fields.Case__c = component.get('v.recordId'); // link to "this" Case
    component.find('myForm').submit(fields);
},
onSuccess: function(component, event, helper){
    var toastEvent = $A.get("e.force:showToast");
    toastEvent.setParams({
        "title": "Success!",
        "message": "Case Type saved OK, refreshing",
        "type": "success"
    });
    toastEvent.fire();
    $A.get('e.force:refreshView').fire(); // reload page
   }
})

请帮助我消除此访问错误

问候, 卡罗琳

【问题讨论】:

    标签: salesforce salesforce-lightning salesforce-communities


    【解决方案1】:

    我怀疑它与共享相关(所以不是组织范围的设置)。如果它正在共享,它只会返回 0 个结果,但不会出现大的红色错误。

    如果删除带有&lt;c:Lookup selection="{!v.selection}" onSearch="{!c.lookupSearch}" onSelection="{!c.useSelected}" errors="{!v.errors}" label="Search" placeholder="Search Case Types Data"/&gt; 的行,错误会消失吗?如果它仍然存在 - 这是自定义代码或Case_Type_Data__c 周围的权限问题。如果它消失了——那就是创建ERT_Case_Type__c)

    检查配置文件(或权限集,如果您使用它们)权限:

    • 读取源对象 (Case_Type_Data__c) 和所有引用的字段 (Level_1__c...)
    • 创建目标对象 (ERT_Case_Type__c) 并读取/编辑所有引用的字段 (Level1__c... 还有Case__c)
    • 阅读Case 对象和Case.CaseNumberCase.Subject 字段
    • 执行 Apex 类的权限(重命名为 Stack,对吗?)。还可以添加运行LookupSearchResult 的权限。

    我怀疑您启用了一些关键更新(设置 -> 关键更新或设置 -> 发布更新),例如“根据用户配置文件限制经过身份验证的用户对 @AuraEnabled Apex 方法的访问”或“需要查看记录名称的权限”查找字段”

    【讨论】:

    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 2014-11-28
    • 2011-03-13
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多