JSON API
JSON API는 요청 객체 또는 ParameterValue 속성에서 getAsJsonContent()를 호출한 후에 사용할 수 있습니다.
- 요청 객체에서 getAsJsonContent()를 호출합니다. 이것은 JsonNode 기본 클래스의 반복 가능한 객체를 반환합니다.
- JsonNode 객체에서 iterator() 또는 getIterator(String xPath)를 호출합니다. 이것은 JSON 객체의 노드를 반복하는 데 사용할 수 있는 JsonNodeIterator 객체를 반환합니다.
- JsonNodeIterator 객체에서 hasNext() 메서드를 호출하여 다른 요소를 사용할 수 있는지 여부를 확인합니다.
- JsonNodeIterator 객체에서 next()를 호출하여 다음 JSON 요소를 반환합니다. hasNext()를 먼저 호출하지 않고는 next()를 호출할 수 없습니다.
- JSON 요소에서 valueFor(String tableName, String fieldName) 를 호출합니다. 이 메서드는 이 요소의 값이 지정된 테이블의 지정된 필드에 매핑됨을 프록시에 알립니다. 그런 다음 프록시는 필드를 암호화해야 하는지 여부를 확인합니다.주:JSON 요소에서 valueFor(String tableName, String fieldName) 를 호출할지 여부를 결정하려면 getName() 메서드를 사용하여 요소의 이름을 반환할 수 있습니다.
인스턴스의 알려진 테이블 필드에 매핑
이 예에서는 JSON 페이로드가 인스턴스에서 처리되어 인시던트 테이블에 기록을 삽입합니다. 설명 필드에는 인시던트에 대한 short_description 내용이 채워집니다.
{
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"
}다음 규칙이 적용될 수 있습니다.
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');
}
}
이 작업은 설명 노드를 반복하고 프록시 서버에 값을 암호화하여 인스턴스의 incident.short_description에 삽입하도록 요청합니다.
인스턴스의 알 수 없는 테이블 필드에 매핑
이 예에서 규칙은 레코드를 반복하지만 어떤 노드가 예상될지 확실하지 않습니다. 유일하게 알려진 것은 레코드 내의 각 오브젝트에 대해 노드가 테이블 URL 매개변수에 지정된 열의 이름과 일치한다는 것입니다.
또한 이 규칙은 테이블이 인시던트인 경우 설명 노드의 데이터를 암호화하여 인스턴스의 short_description 필드에 저장하도록 지정합니다.
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);
}
}
}encryptFieldsInRecord() 함수에서 valueFor() 메서드는 요청에 따라 동적으로 할당된 테이블 및 필드에서 호출됩니다. 테이블 및 필드 이름이 변경될 수 있더라도 규칙은 정의된 암호화 구성에 따라 테이블의 필드를 암호화해야 하는지 여부를 확인하도록 프록시에 요청합니다.
필드가 암호화에 대해 구성되지 않았거나 노드 이름이 테이블의 필드와 일치하지 않는 경우 프록시는 해당 노드를 건너뜁니다. 노드 이름이 암호화용으로 표시된 필드와 일치하면 프록시가 값을 암호화합니다.
인코딩된 쿼리 사용
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);
}
}이 예제에서 규칙은 데이터를 반복합니다. 레코드를 찾으면 두 번째 예제와 동일한 논리를 수행하여 각 노드의 필드를 반복합니다. 쿼리 노드를 찾으면 encodedQueryFor()를 호출하여 쿼리에서 암호화해야 하는 값을 암호화합니다.