diff --git a/examples/abac_rule_model.conf b/examples/abac_rule_model.conf new file mode 100644 index 0000000..591dd3a --- /dev/null +++ b/examples/abac_rule_model.conf @@ -0,0 +1,11 @@ +[request_definition] +r = sub, obj, act + +[policy_definition] +p = sub_rule, obj, act + +[policy_effect] +e = some(where (p.eft == allow)) + +[matchers] +m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act \ No newline at end of file diff --git a/examples/abac_rule_policy.csv b/examples/abac_rule_policy.csv new file mode 100644 index 0000000..4392ad7 --- /dev/null +++ b/examples/abac_rule_policy.csv @@ -0,0 +1 @@ +p, r.sub.Age > 18 && r.sub.Age < 60, /data1, read \ No newline at end of file diff --git a/src/main/java/org/casbin/CommandExecutor.java b/src/main/java/org/casbin/CommandExecutor.java index fa5bd81..470030a 100644 --- a/src/main/java/org/casbin/CommandExecutor.java +++ b/src/main/java/org/casbin/CommandExecutor.java @@ -1,6 +1,7 @@ package org.casbin; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.casbin.jcasbin.main.EnforceResult; import org.casbin.jcasbin.main.Enforcer; @@ -25,6 +26,32 @@ public CommandExecutor(NewEnforcer enforcer, String inputMethodName, String[] in this.inputVal = inputVal; } + /*** + * Converts a string input into a JSON formatted string. + * + * @param input The input string to be converted to JSON format. It should be enclosed in curly braces {}. + * @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(","); + } + } + if (jsonBuilder.length() > 1) { + jsonBuilder.deleteCharAt(jsonBuilder.length() - 1); + } + jsonBuilder.append("}"); + return jsonBuilder.toString(); + } + public String outputResult() throws InvocationTargetException, IllegalAccessException, JsonProcessingException { Class clazz = enforcer.getClass(); Method[] methods = clazz.getMethods(); @@ -75,7 +102,30 @@ public String outputResult() throws InvocationTargetException, IllegalAccessExce } } - Object invoke = method.invoke(enforcer, convertedParams); + Object[] extraConvertedParams = new Object[inputVal.length]; + boolean hasJson = false; + 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); + } + hasJson = true; + } + } catch (Exception e) { + e.printStackTrace(); + hasJson = false; + } + Object invoke; + if(hasJson){ + invoke = method.invoke(enforcer, (Object) extraConvertedParams); + } else { + invoke = method.invoke(enforcer, convertedParams); + } + if(returnType == boolean.class) { responseBody.setAllow((Boolean) invoke); } else if (returnType == List.class) { diff --git a/src/test/java/org/casbin/ClientTest.java b/src/test/java/org/casbin/ClientTest.java index b3df73e..11803a5 100644 --- a/src/test/java/org/casbin/ClientTest.java +++ b/src/test/java/org/casbin/ClientTest.java @@ -319,5 +319,9 @@ public void resetBasicWithResourcesPolicyFile() { } } - + @Test + 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\"]}"); + } }