ANS-0958 · DéVELOPPEMENT SUITESCRIPT
Comment contourner les restrictions d’autorisation côté client avec les Suitelets dans NetSuite
Utilisez les Suitelets « Run As Admin » pour accéder en toute sécurité aux enregistrements NetSuite externes et les modifier à partir de scripts côté client, en contournant les restrictions d'autorisation propres à chaque utilisateur.
Solution courte
Les scripts côté client dans NetSuite fonctionnent selon les autorisations de l’utilisateur, ce qui limite l’accès aux enregistrements en dehors du contexte actuel. Pour contourner cette limitation, mettez en place un Suitelet « Run As Admin » (Exécuter en tant qu’administrateur) servant d’intermédiaire. Ce Suitelet peut effectuer des recherches ou des mises à jour d’enregistrements avec des autorisations élevées, puis renvoyer les données nécessaires au script côté client, garantissant ainsi un accès sécurisé et sans restriction aux données.
Scénario
Les scripts côté client de NetSuite sont intrinsèquement limités par les autorisations de l’utilisateur actuellement connecté. Cette restriction peut empêcher les scripts de lire ou d’écrire des données dans des types d’enregistrements autres que celui sur lequel le script s’exécute actuellement. Les développeurs rencontrent souvent des difficultés lorsqu’un script côté client doit interagir avec des enregistrements externes mais se heurte à des échecs liés aux autorisations.
Solution
Bien que les scripts d’événements utilisateur puissent être configurés pour s’exécuter en mode « Run As Admin » (Exécuter en tant qu’administrateur) afin d’accéder à n’importe quel enregistrement sans restriction d’autorisation, cette fonctionnalité n’est pas disponible pour les scripts côté client. Les scripts côté client s’exécutent toujours en utilisant les autorisations de l’utilisateur. Par conséquent, lorsqu’un script côté client nécessite d’accéder à des enregistrements externes, il doit utiliser un Suitelet intermédiaire pour récupérer ou mettre à jour les informations nécessaires. Ce Suitelet peut être configuré pour « s’exécuter en tant qu’administrateur », ce qui lui permet de contourner les autorisations de l’utilisateur client.
Vous trouverez ci-dessous un exemple de code pour un Suitelet SuiteScript 2.1 qui reproduit la fonctionnalité de recherche de valeurs de champ, ainsi qu’une fonction d’aide côté client correspondante.
Suitelet de recherche de champ (SuiteScript 2.1)
Ce Suitelet est conçu pour recevoir le type d’enregistrement, l’ID et le ou les champs en tant que paramètres via une requête POST, effectuer une recherche à l’aide de
search.lookupFieldset renvoyer le résultat sous forme de chaîne JSON. Ce Suitelet doit être déployé avec le paramètre « Exécuter en tant qu’administrateur » activé.
javascript
/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
define(['N/search', 'N/log', 'N/runtime'], function(search, log, runtime) {
function onRequest(scriptContext) {
if (scriptContext.request.method === 'POST') {
var recordType = scriptContext.request.parameters.recordtype;
var recordId = scriptContext.request.parameters.recordid;
var recordFields = scriptContext.request.parameters.recordfield;
log.debug({ title: 'Suitelet Lookup - recordType', details: recordType });
log.debug({ title: 'Suitelet Lookup - recordId', details: recordId });
log.debug({ title: 'Suitelet Lookup - recordFields', details: recordFields });
if (recordType && recordId && recordFields) {
var columnsToLookup;
if (recordFields.indexOf(',') !== -1) {
columnsToLookup = recordFields.split(',');
} else {
columnsToLookup = recordFields;
}
try {
var fieldValue = search.lookupFields({
type: recordType,
id: recordId,
columns: columnsToLookup
});
var output = JSON.stringify(fieldValue);
log.debug({ title: 'Suitelet Lookup - output', details: output });
scriptContext.response.write(output);
} catch (e) {
log.error({ title: 'Suitelet Lookup Error', details: e });
scriptContext.response.write("ERROR: " + e.message);
}
} else {
log.debug({ title: 'Suitelet Lookup - missing parameter', details: 'A missing parameter prevents from looking up value' });
scriptContext.response.write("0");
}
}
}
return {
onRequest: onRequest
};
});Fonction d’aide côté client (SuiteScript 2.1)
Cette fonction d’aide, destinée aux scripts côté client, construit les paramètres de requête et appelle le Suitelet déployé. Elle analyse ensuite la réponse JSON renvoyée par le Suitelet afin de restituer les valeurs des champs demandés.
javascript
/**
* @NApiVersion 2.1
* @NModuleScope Public
*/
define(['N/url', 'N/https'], function(url, https) {
function getValueViaSuitelet(recordType, recordId, recordField) {
var ssuValue = null;
var fieldsParam;
if (Array.isArray(recordField)) {
fieldsParam = recordField.join(",");
} else {
fieldsParam = recordField;
}
var params = {
recordtype: recordType,
recordid: recordId,
recordfield: fieldsParam
};
var suiteletURL = url.resolveScript({
scriptId: 'customscript_suitelet_lookup_id', // Replace with your Suitelet Script ID
deploymentId: 'customdeploy_suitelet_lookup_deploy', // Replace with your Suitelet Deployment ID
returnExternalUrl: false
});
try {
var response = https.post({
url: suiteletURL,
body: JSON.stringify(params),
headers: {
'Content-Type': 'application/json'
}
});
if (response.body !== "0" && response.body.indexOf("ERROR") === -1) {
ssuValue = JSON.parse(response.body);
} else {
console.error("Suitelet returned an error or '0': " + response.body);
}
} catch (e) {
console.error("Error calling Suitelet: " + e.message);
}
return ssuValue;
}
return {
getValueViaSuitelet: getValueViaSuitelet
};
});Remarques relatives à la mise en œuvre :
- Remplacez
'customscript_suitelet_lookup_id'
et 'customdeploy_suitelet_lookup_deploy'
dans la fonction d’aide côté client par l’ID de script et l’ID de déploiement réels de votre Suitelet déployé.
- Le Suitelet renvoie toujours un objet JSON, même si un seul champ est demandé. La fonction côté client
JSON.parse()
gère cette conversion.
Support expert NetSuite
Besoin d’aide pour cet enjeu NetSuite ?
Accompagnement-conseil et configuration pour Développement SuiteScript
