2015-12-08 2 views
1

Вот моя проблема, я создал приложение в SalesForce, и он отлично работает для меня. У меня есть права администратора. В этом приложении у меня есть iFrame, который ссылается на SF, сервлет-файл-читатель, когда я его вызываю при входе в систему как администратор, он отлично работает, но когда я пытаюсь со стандартным пользователем, я получаю следующую ошибку:Вопрос Http и iFrame в SalesForce, INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

Refused to display ' https://myDomain.salesforce.com/servlet/servlet.FileDownload?file=00PG000000UCL0CMAX ' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

Это первая проблема, вторая - с запросом Http. Я создаю приложение с AngularJS через запрос Http, и он отлично работает при входе в систему как администратор, но для стандартных пользователей я получаю следующую ошибку:

POST https://myDomain.salesforce.com/services/data/v26.0/sobjects/Attachment/ 400 (Bad Request)

Для этой конкретной части я конфигурирование запроса HTTP, как следующие:

app.run(['$http', '$window', function($http, $window) { 

    /*Get the '{!GETSESSIONID()}' value cannot be processed on static ressource, 
      hence the link to the window global variable.*/ 
    var sessionId = $window.__sfdcSessionId; 

    $http.defaults.useXDomain = true; 
    delete $http.defaults.headers.common["X-Requested-With"]; 

    /* In order for this to work the domain has to be white-listed within 
      SalesForce security Settings > CORS */ 
    $http.defaults.headers.common["Access-Control-Allow-Origin"] = "*"; 
    $http.defaults.headers.common["Accept"] = "application/json"; 
    $http.defaults.headers.common["Content-Type"] = "application/json"; 
    //Session ID necessary for authentication purposes. 
    $http.defaults.headers.common['Authorization'] = "OAuth " + sessionId; 
    $http.defaults.headers.common['X-User-Agent'] = "MyClient"; 
}]); 

Снова он отлично работает для админов, но не для обычных пользователей. Любые мысли, я предполагаю, что это имеет какое-то отношение к разрешению, но я, очевидно, не хочу предоставлять привилегии администратора всем ... Я не уверен, откуда эта проблема возникает, какие-либо предложения?

UPDATE: Глядя через сетевой вызов я был в состоянии получить более точную ошибку, касающуюся Bad Request:

INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

Network Request and Responsee

Так что я знаю, что это связано с правами доступа, но может «Не знаю, что делать, чтобы заставить его работать для всех пользователей, а не просто админов ... Любые предложения?

Я прикрепил функцию фактических AngularJS, что делает вызов:

attachment.save = функция (base64value, документ) {

/*Stripping the file type text in front of the base64 
     string, without this the file would show as corrupted */ 
    var position = base64value.indexOf("base64,"); 
    var matchWord = "base64,"; 
    var base64valueClean = base64value.slice(position + matchWord.length, base64value.length); 

    //Setting payload to be saved in SF database. 
    var data = { 
     "Body": base64valueClean, 
     "ContentType": document.attachmentContentType, 
     "ParentId": document.id, 
     "Name": document.fileName 
    }; 

    var requestHeaders = { 
      'Timeout': '600', 
      'Content-Type': 'application/json', 
      'Authorization': 'Bearer ' + $window.__sfdcSessionId 
     }; 


    /*Get the {!URLFOR('/services/data/v26.0/sobjects/Attachment/')} value 
     cannot be processed on static ressource, hence the link to the window 
     global variable.*/ 
    var url = $window.__url; 
    var method = 'POST'; 

    /* May be useful in future 
    //Allows this function to be used for updates as well as insert 
    var isUpdate = ($.trim(document.attachmentId) !==); 
    if (isUpdate) { 
     url = url + document.attachmentId; 
     method = 'PATCH'; 
    } else { 
     // Method for creation 
     method = 'POST'; 
    };*/ 

    //Request system data 
    var request = { 

     url: url, 
     method: method, 
     data: data, 
     requestHeaders: requestHeaders 

    }; 

    console.log(request); 

    //Promise type approach to Http request, allows easy handle of succes and failure 
    // Very useful for asynchronous calls. 
    var deferred = $q.defer(); 

    //Performing http request to Server 
    $http(request).then(function(response) { 

     deferred.resolve(response); 
     console.log('File UPLOADED to SF!'); 

    }, function(event) { 

     //Need to Improve error handling!!! 
     deferred.reject('The attachment could not be saved:' + event); 

    }); 


    return deferred.promise; 
} 

ответ

0

Ну, все это сводилось к разрешениям в профиле. У пользователей не было права на чтение и запись для родительского объекта, связанного с этим вложением.

Я изменил его, и теперь он работает как шарм ... Не так сложно, как я думал, ответ будет!

Смежные вопросы