Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 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 All @@ -32,32 +33,32 @@ mvn clean install
- Check whether Alice has read permission on data1

```shell
java -jar target/casbin-java-cli.jar -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -e "alice, data1, read"
./casbin.sh -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -e "alice, data1, read"
```
> Allow
```shell
java -jar target/casbin-java-cli.jar -m "[request_definition]|r = sub, obj, act|[policy_definition]|p = sub, obj, act|[role_definition]|g = _, _|[policy_effect]|e = some(where (p.eft == allow))|[matchers]|m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act" -p "p, alice, data1, read|p, bob, data2, write|p, data2_admin, data2, read|p, data2_admin, data2, write|g, alice, data2_admin" -e "alice, data1, read"
./casbin.sh -m "[request_definition]|r = sub, obj, act|[policy_definition]|p = sub, obj, act|[role_definition]|g = _, _|[policy_effect]|e = some(where (p.eft == allow))|[matchers]|m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act" -p "p, alice, data1, read|p, bob, data2, write|p, data2_admin, data2, read|p, data2_admin, data2, write|g, alice, data2_admin" -e "alice, data1, read"
```
> Allow

- Check whether Alice has write permission for data2. If so, display the effective policy.

```shell
java -jar target/casbin-java-cli.jar -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -ex "alice, data2, write"
./casbin.sh -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -ex "alice, data2, write"
```
> true Reason: [alice, data2, write]

- Add a policy to the policy file

```shell
java -jar target/casbin-java-cli.jar -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -ap "alice, data2, write"
./casbin.sh -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -ap "alice, data2, write"
```
> Add Success

- Delete a policy from the policy file

```shell
java -jar target/casbin-java-cli.jar -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -rp "alice,data1,read"
./casbin.sh -m "examples/rbac_model.conf" -p "examples/rbac_policy.csv" -rp "alice,data1,read"
```
> Remove Success

5 changes: 5 additions & 0 deletions casbin.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@echo off
setlocal
set JAR_PATH=target\casbin-java-cli.jar
java -jar "%JAR_PATH%" %*
endlocal
2 changes: 2 additions & 0 deletions casbin.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/sh
java -jar target/casbin-java-cli.jar "$@"
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