We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent d669dff commit 6a40ed3Copy full SHA for 6a40ed3
examples/priority_model_explicit.conf
@@ -2,7 +2,7 @@
2
r = sub, obj, act
3
4
[policy_definition]
5
-p = priority, sub, obj, act, eft
+p = sub, obj, act, eft, priority
6
7
[role_definition]
8
g = _, _
examples/priority_policy_explicit.csv
@@ -1,12 +1,12 @@
1
-p, 10, data1_deny_group, data1, read, deny
-p, 10, data1_deny_group, data1, write, deny
-p, 10, data2_allow_group, data2, read, allow
-p, 10, data2_allow_group, data2, write, allow
+p, data1_deny_group, data1, read, deny, 10
+p, data1_deny_group, data1, write, deny, 10
+p, data2_allow_group, data2, read, allow, 10
+p, data2_allow_group, data2, write, allow, 10
-p, 1, alice, data1, write, allow
-p, 1, alice, data1, read, allow
9
-p, 1, bob, data2, read, deny
+p, alice, data1, write, allow, 1
+p, alice, data1, read, allow, 1
+p, bob, data2, read, deny, 1
10
11
g, bob, data2_allow_group
12
-g, alice, data1_deny_group
+g, alice, data1_deny_group
src/main/java/org/casbin/jcasbin/model/Assertion.java
@@ -30,6 +30,7 @@ public class Assertion {
30
public String[] tokens;
31
public List<List<String>> policy;
32
public RoleManager rm;
33
+ public int priorityIndex;
34
35
public Assertion() {
36
policy = new ArrayList<>();
@@ -94,4 +95,8 @@ public void buildIncrementalRoleLinks(RoleManager rm, Model.PolicyOperations op,
94
95
}
96
97
98
+
99
+ public void initPriorityIndex() {
100
+ priorityIndex = -1;
101
+ }
102
src/main/java/org/casbin/jcasbin/model/Model.java
@@ -66,15 +66,20 @@ public boolean addDef(String sec, String key, String value) {
66
Assertion ast = new Assertion();
67
ast.key = key;
68
ast.value = value;
69
+ ast.initPriorityIndex();
70
71
if (ast.value.equals("")) {
72
return false;
73
74
75
if (sec.equals("r") || sec.equals("p")) {
76
ast.tokens = splitCommaDelimited(ast.value);
- for (int i = 0; i < ast.tokens.length; i ++) {
77
+ for (int i = 0; i < ast.tokens.length; i++) {
78
ast.tokens[i] = key + "_" + ast.tokens[i];
79
80
+ if ("p_priority".equals(ast.tokens[i])) {
81
+ ast.priorityIndex = i;
82
83
84
} else {
85
ast.value = Util.removeComments(Util.escapeAssertion(ast.value));
@@ -207,14 +212,17 @@ public void printModel() {
207
212
* sort policies by priority value
208
213
*/
209
214
public void sortPoliciesByPriority() {
210
- if (model.containsKey("p")) {
211
- for (Map.Entry<String, Assertion> entry : model.get("p").entrySet()) {
- Assertion assertion = entry.getValue();
- if (!(entry.getKey() + "_priority").equals(assertion.tokens[0])) {
- continue;
215
- }
216
- assertion.policy.sort(Comparator.comparingInt(p -> Integer.parseInt(p.get(0))));
+ if (!model.containsKey("p")) {
+ return;
217
218
219
+ for (Map.Entry<String, Assertion> entry : model.get("p").entrySet()) {
220
+ Assertion assertion = entry.getValue();
221
+ int priorityIndex = assertion.priorityIndex;
222
+ if (priorityIndex < 0) {
223
+ continue;
224
225
+ assertion.policy.sort(Comparator.comparingInt(p -> Integer.parseInt(p.get(priorityIndex))));
226
227
228
src/main/java/org/casbin/jcasbin/model/Policy.java
@@ -182,15 +182,16 @@ public boolean addPolicy(String sec, String ptype, List<String> rule) {
182
if (!hasPolicy(sec, ptype, rule)) {
183
Assertion assertion = model.get(sec).get(ptype);
184
List<List<String>> policy = assertion.policy;
185
186
187
// ensure the policies is ordered by priority value
- if ("p".equals(sec) && (ptype + "_priority").equals(assertion.tokens[0])) {
188
- int value = Integer.parseInt(rule.get(0));
+ if ("p".equals(sec) && priorityIndex >= 0) {
189
+ int value = Integer.parseInt(rule.get(priorityIndex));
190
int left = 0, right = policy.size();
191
// binary insert
192
while (left < right) {
193
int mid = (left + right) >>> 1;
- if (value > Integer.parseInt(policy.get(mid).get(0))) {
194
+ if (value > Integer.parseInt(policy.get(mid).get(priorityIndex))) {
195
left = mid + 1;
196
197
right = mid;
src/test/java/org/casbin/jcasbin/main/EnforcerUnitTest.java
@@ -514,7 +514,7 @@ public void testPriorityExplicit() {
514
testEnforce(e, "data2_allow_group", "data2", "write", true);
515
516
// add a higher priority policy
517
- e.addPolicy("1", "bob", "data2", "write", "deny");
+ e.addPolicy("bob", "data2", "write", "deny", "1");
518
519
testEnforce(e, "alice", "data1", "write", true);
520
testEnforce(e, "alice", "data1", "read", true);
0 commit comments