API JSON
Les API JSON peuvent être utilisées après l’appel de getAsJsonContent()sur l’objet de demande ou une propriété ParameterValue .
- Appelez getAsJsonContent() sur l’objet de la demande. Cela renvoie un objet itérable de la classe sous-jacente JsonNode .
- Appelez iterator() ou getIterator(String xPath) sur l’objet JsonNode . Cela renvoie un objet JsonNodeIterator qui peut être utilisé pour itérer sur les nœuds de l’objet JSON.
- Appelez la méthode hasNext() sur l’objet JsonNodeIterator pour déterminer si un autre élément est disponible.
- Appelez next() sur l’objet JsonNodeIterator pour renvoyer l’élément JSON suivant. Vous ne pouvez pas appeler next() sans appeler d’abord hasNext().
- Appelez valueFor(String tableName, String fieldName) sur l’élément JSON. Cette méthode indique au proxy que la valeur de cet élément est mappée au champ spécifié dans la table spécifiée. Le proxy vérifie ensuite si le champ doit être chiffré.Remarque :Pour déterminer si vous souhaitez appeler valueFor(String tableName, String fieldName) sur un élément JSON, vous pouvez utiliser la méthode getName() pour renvoyer le nom de l’élément.
Mappage à un champ de table connu sur l’instance
Dans cet exemple, la charge utile JSON est traitée sur l’instance pour insérer des enregistrements dans la table d’incidents. Le champ de description renseigne les short_description sur l’incident.
{
data: {
records: [
{
"name": "Test Record 1",
"description": "Test Record 1 Description",
"tag": "security"
},
{
"name": "Test Record 1",
"description": "Test Record 1 Description",
"tag": "security"
}],
"query": "assigned_to=3D4860165813e63a00d00abd322244b092^category=vulnerability"
},
"source": "10.11.13.14"
}La règle suivante peut s’appliquer :
function sampleJsonAction1() {
var jsonContent = request.getAsJsonContent();
// This loop iterates over all description elements in the records array
var jsonNodeIterator = jsonContent.getIterator(’/data/records/description’);
while (jsonNodeIterator.hasNext()) {
var jsonNode = jsonNodeIterator.next();
jsonNode.valueFor('incident', 'short_decription');
}
}
Cette action itère à travers les nœuds de description et demande au serveur proxy de chiffrer les valeurs et de les insérer dans incident.short_description sur l’instance.
Mappage à un champ de table inconnu sur l’instance
Dans cet exemple, la règle itère sur les enregistrements, mais ne sait pas à quels nœuds s’attendre. La seule certitude est que pour chaque objet dans les enregistrements, les nœuds correspondent aux noms des colonnes spécifiées dans le paramètre URL de la table.
La règle spécifie également que, si la table est incidente, les données du nœud de description doivent être chiffrées et stockées dans le champ short_description de l’instance.
function sampleJsonAction2() {
var jsonContent = request.getAsJsonContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var jsonNodeIterator = jsonContent.getIterator('data/records');
while (jsonNodeIterator.hasNext()) {
encryptFieldsInRecord(jsonNodeIterator.next());
}
}
function encryptFieldsInRecord(jsonNode) {
//this time we want to iterate over all nodes
var fieldIterator = jsonNode.iterator();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
if (fieldName == 'description') {
field.valueFor(tableName, 'short_description');
} else {
field.valueFor(tableName, fieldName);
}
}
}Dans la fonction encryptFieldsInRecord(), la méthode valueFor() est appelée sur une table et un champ qui sont affectés dynamiquement en fonction de la demande. Même si les noms de table et de champ peuvent changer, la règle demande au proxy de vérifier si le champ de la table doit être chiffré en fonction des configurations de chiffrement définies.
Si le champ n’est pas configuré pour le chiffrement ou si le nom de nœud ne correspond pas à un champ de la table, le proxy ignore ce nœud. Si le nom du nœud correspond à un champ marqué pour chiffrement, le proxy chiffre la valeur.
Utilisation d’une requête codée
function sampleJsonAction3() {
var jsonContent = request.getAsJsonContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var jsonNodeIterator = jsonContent.getIterator('data');
while (jsonNodeIterator.hasNext()) {
var jsonNode = jsonNodeIterator.next();
if (jsonNode.getName() == 'records')
encryptRecors(jsonNodeIterator.next());
else if (jsonNode.getName() == 'query')
jsonNode.encodedQueryFor(tableName);
}
}
function encryptRecords(jsonNode) {
//we iterate over all fields in the node
var recordIterator = jsonNode.iterator();
while (recordIterator.hasNext()) {
encryptFieldsInRecord(recordIterator.next());
}
}
function encryptFieldsInRecord(jsonNode) {
//this time we want to iterate over all nodes
var fieldIterator = jsonNode.iterator();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
field.valueFor(tableName, fieldName);
}
}Dans cet exemple, la règle itère sur les données. Lorsqu’il trouve des enregistrements, il exécute la même logique que dans le deuxième exemple, en itérant sur les champs de chaque nœud. Lorsqu’il trouve le nœud de requête , il appelle encodedQueryFor() pour chiffrer les valeurs qui doivent être chiffrées dans la requête.