Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support custom function, Management API and RBAC with Domains API #10

Merged
merged 10 commits into from
Aug 21, 2024
Merged
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ mvn clean install
| `-p, --policy` | The path of the policy file or policy text | y | Please wrap it with `""` and separate each line with `\|` |
| `-e, --enforce` | Check permissions | n | Please wrap it with `""` |
| `-ex, --enforceEx` | Check permissions and get which policy it is | n | Please wrap it with `""` |
| `-af, --addFuntion` | Add custom funtion | n | Please wrap it with `""` and separate each line with `\|` |
| `-ap, --addPolicy` | Add a policy rule to the policy file | n | Please wrap it with `""` |
| `-rp, --removePolicy` | Remove a policy rule from the policy file | n | Please wrap it with `""` |

Expand Down
2 changes: 1 addition & 1 deletion examples/abac_rule_with_domains_policy.csv
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ p, r.domain == 'domain1', admin, domain1, data1, write
p, r.domain == 'domain2', admin, domain2, data2, read
p, r.domain == 'domain2', admin, domain2, data2, write
g, alice, admin, domain1
g, bob, admin, domain2
g, bob, admin, domain2
5 changes: 5 additions & 0 deletions examples/keymatch_policy.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
p, alice, /alice_data/*, GET
p, alice, /alice_data/resource1, POST
p, bob, /alice_data/resource2, GET
p, bob, /bob_data/*, POST
p, cathy, /cathy_data, (GET)|(POST)
6 changes: 0 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,6 @@

<packaging>jar</packaging>

<!-- <parent>-->
<!-- <groupId>org.sonatype.oss</groupId>-->
<!-- <artifactId>oss-parent</artifactId>-->
<!-- <version>7</version>-->
<!-- </parent>-->

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Expand Down
167 changes: 99 additions & 68 deletions src/main/java/org/casbin/Client.java
Original file line number Diff line number Diff line change
@@ -1,89 +1,120 @@
package org.casbin;


import org.apache.commons.cli.*;
import org.casbin.jcasbin.exception.CasbinEffectorException;
import org.casbin.jcasbin.main.EnforceResult;
import org.casbin.command.*;
import org.casbin.generate.DynamicClassGenerator;
import org.casbin.jcasbin.util.function.CustomFunction;
import org.casbin.util.Util;


import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;


public class Client {
private static void configureOptions(Options options) {
Option[] cliOptions = {
addOption("m", "model", true, "the path of the model file"),
addOption("p", "policy", true, "the path of the policy file"),
addOption("e", "enforce", true, "enforce"),
addOption("ex", "enforceEx", true, "enforceEx"),
addOption("ap", "addPolicy", true, "Add a policy rule to the storage"),
addOption("rp", "removePolicy", true, "Remove a policy rule from the storage")
};
for (Option option : cliOptions) {
options.addOption(option);
}
}
private static Option addOption(String shortOpt, String longOpt, boolean hasArg, String description) {
return new Option(shortOpt, longOpt, hasArg, description);
}

public static Object run(String[] args) throws ParseException {
Options options = new Options();
configureOptions(options);
private static final String RBAC_COMMAND = "rbac";
private static final String RBAC_WITH_CONDITION_COMMAND = "rbac_with_condition";
private static final String RBAC_WITH_DOMAINS_COMMAND = "rbac_with_domains";
private static final String ROLEMANAGER_COMMAND = "role_manager";
private static final String MANAGEMENT_COMMAND = "management";

CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
private static final Map<String, AbstractCommand> COMMANDS = new HashMap<>();

String model = cmd.getOptionValue("model");
String policy = cmd.getOptionValue("policy");
NewEnforcer enforcer = null;
try {
enforcer = new NewEnforcer(model, policy);
} catch (NullPointerException | CasbinEffectorException | UnsupportedOperationException e) {
System.out.println("unsupported effect:" + e.getMessage());
System.exit(0);
} catch (Exception e) {
System.out.println(e.getMessage());
System.exit(0);
}
static {
COMMANDS.put(RBAC_COMMAND, new RBACCommand());
COMMANDS.put(RBAC_WITH_CONDITION_COMMAND, new RBACWithConditionsCommand());
COMMANDS.put(RBAC_WITH_DOMAINS_COMMAND, new RBACWithDomainsCommand());
COMMANDS.put(ROLEMANAGER_COMMAND, new RoleManagerCommand());
COMMANDS.put(MANAGEMENT_COMMAND, new ManagementCommand());
}

public static String run(String... args) {
String result = "";

try {
if(cmd.hasOption("enforce")) {
String enforceArgs = cmd.getOptionValue("enforce").replace(" ","");
boolean result = enforcer.enforce(enforceArgs.split(","));
System.out.println(result ? "Allow" : "Ban");
return result;
} else if (cmd.hasOption("enforceEx")) {
String enforceArgs = cmd.getOptionValue("enforceEx").replace(" ","");
EnforceResult enforceResult = enforcer.enforceEx(enforceArgs.split(","));
boolean allow = enforceResult.isAllow();
if(allow) {
System.out.printf("%s Reason: %s", allow, enforceResult.getExplain());
if(args == null || args.length == 0) {
printUsageMessageAndExit("");
}

Options options = new Options();
Option option = new Option("m", "model", true, "the path of the model file or model text");
options.addOption(option);
option = new Option("p", "policy", true, "the path of the policy file or policy text");
options.addOption(option);
option = new Option("af", "addFunction", true, "add custom function");
option.setRequired(false);
options.addOption(option);

boolean hasAddFuntion = false;
for (String arg : args) {
if(arg.equals("-af") || arg.equals("-addFunction")) {
hasAddFuntion = true;
break;
}
}

CommandLineParser parser = new DefaultParser();

CommandLine cmd = null;
if(hasAddFuntion) {
cmd = parser.parse(options, Arrays.stream(args).limit(7).toArray(String[]::new));
} else {
cmd = parser.parse(options, Arrays.stream(args).limit(5).toArray(String[]::new));
}

if(cmd.hasOption("model") && cmd.hasOption("policy")) {
String model = cmd.getOptionValue("model");
String policy = cmd.getOptionValue("policy");
NewEnforcer enforcer = new NewEnforcer(model, policy);

if (hasAddFuntion) {
String codes = cmd.getOptionValue("addFunction");
String methodName = Util.getMethodName(codes);
CustomFunction customFunction = DynamicClassGenerator.generateClass(methodName, codes);
enforcer.addFunction(methodName, customFunction);
}

String commandName = args[0];
AbstractCommand command = COMMANDS.get(commandName);



if(command != null) {
if(hasAddFuntion) {
result = command.run(enforcer, Arrays.copyOfRange(args, 7, args.length));
} else {
result = command.run(enforcer, Arrays.copyOfRange(args, 5, args.length));
}
// System.exit(0);
} else {
System.out.println(allow);
printUsageMessageAndExit(commandName);
}
return allow;
}else if (cmd.hasOption("addPolicy")){
String policyArgs = cmd.getOptionValue("addPolicy").replace(" ","");
boolean result = enforcer.addPolicy(policyArgs.split(","));
System.out.println(result ? "Add Success" : "Add Failed");
enforcer.savePolicy();
return result;
}else if (cmd.hasOption("removePolicy")){
String policyArgs = cmd.getOptionValue("removePolicy").replace(" ","");
boolean result = enforcer.removePolicy(policyArgs.split(","));
System.out.println(result ? "Remove Success" : "Remove Failed");
enforcer.savePolicy();
return result;
}else {
System.out.println("Command Error");
return null;

} else {
new HelpCommand().run();
System.exit(1);
}
} catch (Exception e) {
System.out.println("unsupported effect:" + e.getMessage());
System.exit(0);
e.printStackTrace();
System.exit(1);
}
return null;
return result;
}


private static void printUsageMessageAndExit(String commandName) throws Exception {
if (commandName.isEmpty()) {
System.out.println("Error: " + commandName + " not recognised");
}

new HelpCommand().run();
System.exit(1);
}

public static void main(String[] args) throws ParseException {
Client cli = new Client();
Object run = run(args);
run(args);
}
}
1 change: 1 addition & 0 deletions src/main/java/org/casbin/NewEnforcer.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.casbin;

import org.casbin.jcasbin.main.Enforcer;
import org.casbin.jcasbin.util.function.CustomFunction;

import java.io.BufferedWriter;
import java.io.File;
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/org/casbin/command/AbstractCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.casbin.command;

import org.casbin.NewEnforcer;

public abstract class AbstractCommand {

protected AbstractCommand() {

}

public abstract String run(NewEnforcer enforcer, String... args) throws Exception;
}
8 changes: 8 additions & 0 deletions src/main/java/org/casbin/command/HelpCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.casbin.command;

public class HelpCommand {

public void run() {
System.out.println("Usage: java -jar casbin-java-cli.jar rbac|rbac_with_condition|rbac_with_domains|role_manager|management [options]");
}
}
Loading
Loading