Вот моя проблема, я создал приложение в 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
Так что я знаю, что это связано с правами доступа, но может «Не знаю, что делать, чтобы заставить его работать для всех пользователей, а не просто админов ... Любые предложения?
Я прикрепил функцию фактических 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;
}