From 623968c2fc4f0cf563c51e4e51b6035a0eebefa4 Mon Sep 17 00:00:00 2001 From: Liao Xin <93535922+liewstar@users.noreply.github.com> Date: Sat, 18 Jan 2025 19:01:29 +0800 Subject: [PATCH] feat: fix "ABAC" model enforceEx error (#40) --- examples/abac_model.conf | 11 ++++ examples/abac_policy.csv | 0 src/main/java/org/casbin/CommandExecutor.java | 53 +++++++++++-------- src/test/java/org/casbin/ClientTest.java | 2 + 4 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 examples/abac_model.conf create mode 100644 examples/abac_policy.csv diff --git a/examples/abac_model.conf b/examples/abac_model.conf new file mode 100644 index 0000000..4198fd7 --- /dev/null +++ b/examples/abac_model.conf @@ -0,0 +1,11 @@ +[request_definition] +r = sub, obj + +[policy_definition] +p = sub, obj + +[policy_effect] +e = some(where (p.eft == allow)) + +[matchers] +m = r.sub == r.obj.Owner \ No newline at end of file diff --git a/examples/abac_policy.csv b/examples/abac_policy.csv new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/casbin/CommandExecutor.java b/src/main/java/org/casbin/CommandExecutor.java index 470030a..d8ebdf4 100644 --- a/src/main/java/org/casbin/CommandExecutor.java +++ b/src/main/java/org/casbin/CommandExecutor.java @@ -33,23 +33,29 @@ public CommandExecutor(NewEnforcer enforcer, String inputMethodName, String[] in * @return A JSON formatted string representing the key-value pairs from the input string. */ public static String convertToJson(String input) { - input = input.trim().substring(1, input.length() - 1).trim(); - StringBuilder jsonBuilder = new StringBuilder("{"); - String[] pairs = input.split(","); - for (String pair : pairs) { - pair = pair.trim(); - String[] keyValue = pair.split(":"); - if (keyValue.length == 2) { - String key = keyValue[0].trim(); - String value = keyValue[1].trim(); - jsonBuilder.append("\"").append(key).append("\":").append(value).append(","); + input = input.trim(); + // Handle the simple format {key: value} + if (!input.contains("\"")) { + input = input.substring(1, input.length() - 1).trim(); + StringBuilder jsonBuilder = new StringBuilder("{"); + String[] pairs = input.split(","); + for (String pair : pairs) { + pair = pair.trim(); + String[] keyValue = pair.split(":"); + if (keyValue.length == 2) { + String key = keyValue[0].trim(); + String value = keyValue[1].trim(); + jsonBuilder.append("\"").append(key).append("\":").append(value).append(","); + } } + if (jsonBuilder.length() > 1) { + jsonBuilder.deleteCharAt(jsonBuilder.length() - 1); + } + jsonBuilder.append("}"); + return jsonBuilder.toString(); } - if (jsonBuilder.length() > 1) { - jsonBuilder.deleteCharAt(jsonBuilder.length() - 1); - } - jsonBuilder.append("}"); - return jsonBuilder.toString(); + + return input; } public String outputResult() throws InvocationTargetException, IllegalAccessException, JsonProcessingException { @@ -104,16 +110,17 @@ public String outputResult() throws InvocationTargetException, IllegalAccessExce Object[] extraConvertedParams = new Object[inputVal.length]; boolean hasJson = false; - try{ + try { ObjectMapper objectMapper = new ObjectMapper(); - if(inputVal.length > 0 && inputVal[0].trim().startsWith("{")) { - Map objectMap = objectMapper.readValue(convertToJson(inputVal[0]), new TypeReference>() { - }); - extraConvertedParams[0] = objectMap; - if (inputVal.length >= 1) { - System.arraycopy(inputVal, 1, extraConvertedParams, 1, inputVal.length - 1); + for (int i = 0; i < inputVal.length; i++) { + if (inputVal[i].trim().startsWith("{")) { + Map objectMap = objectMapper.readValue(convertToJson(inputVal[i]), new TypeReference>() { + }); + extraConvertedParams[i] = objectMap; + hasJson = true; + } else { + extraConvertedParams[i] = inputVal[i]; } - hasJson = true; } } catch (Exception e) { e.printStackTrace(); diff --git a/src/test/java/org/casbin/ClientTest.java b/src/test/java/org/casbin/ClientTest.java index 751b027..86e73b0 100644 --- a/src/test/java/org/casbin/ClientTest.java +++ b/src/test/java/org/casbin/ClientTest.java @@ -323,6 +323,8 @@ public void resetBasicWithResourcesPolicyFile() { public void testABACRule() { assertEquals(Client.run(new String[]{"enforce", "-m", "examples/abac_rule_model.conf", "-p", "examples/abac_rule_policy.csv", "{Age: 30}", "/data1", "read"}), "{\"allow\":true,\"explain\":null}"); assertEquals(Client.run(new String[]{"enforceEx", "-m", "examples/abac_rule_model.conf", "-p", "examples/abac_rule_policy.csv", "{Age: 30}", "/data1", "read"}), "{\"allow\":true,\"explain\":[\"r.sub.Age > 18 && r.sub.Age < 60\",\"/data1\",\"read\"]}"); + assertEquals(Client.run(new String[]{"enforce", "-m", "examples/abac_model.conf", "-p", "examples/abac_policy.csv", "alice", "{ \"Owner\" : \"alice\" }"}), "{\"allow\":true,\"explain\":null}"); + assertEquals(Client.run(new String[]{"enforceEx", "-m", "examples/abac_model.conf", "-p", "examples/abac_policy.csv", "alice", "{ \"Owner\" : \"alice\" }"}), "{\"allow\":true,\"explain\":[]}"); } @Test