Skip to content

Commit 6a40ed3

Browse files
committed
fix: priority cannot be non first policy element
issue: casbin#177 Signed-off-by: tsund <[email protected]>
1 parent d669dff commit 6a40ed3

File tree

6 files changed

+35
-21
lines changed

6 files changed

+35
-21
lines changed

examples/priority_model_explicit.conf

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
r = sub, obj, act
33

44
[policy_definition]
5-
p = priority, sub, obj, act, eft
5+
p = sub, obj, act, eft, priority
66

77
[role_definition]
88
g = _, _

examples/priority_policy_explicit.csv

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
p, 10, data1_deny_group, data1, read, deny
2-
p, 10, data1_deny_group, data1, write, deny
3-
p, 10, data2_allow_group, data2, read, allow
4-
p, 10, data2_allow_group, data2, write, allow
1+
p, data1_deny_group, data1, read, deny, 10
2+
p, data1_deny_group, data1, write, deny, 10
3+
p, data2_allow_group, data2, read, allow, 10
4+
p, data2_allow_group, data2, write, allow, 10
55

66

7-
p, 1, alice, data1, write, allow
8-
p, 1, alice, data1, read, allow
9-
p, 1, bob, data2, read, deny
7+
p, alice, data1, write, allow, 1
8+
p, alice, data1, read, allow, 1
9+
p, bob, data2, read, deny, 1
1010

1111
g, bob, data2_allow_group
12-
g, alice, data1_deny_group
12+
g, alice, data1_deny_group

src/main/java/org/casbin/jcasbin/model/Assertion.java

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class Assertion {
3030
public String[] tokens;
3131
public List<List<String>> policy;
3232
public RoleManager rm;
33+
public int priorityIndex;
3334

3435
public Assertion() {
3536
policy = new ArrayList<>();
@@ -94,4 +95,8 @@ public void buildIncrementalRoleLinks(RoleManager rm, Model.PolicyOperations op,
9495
}
9596
}
9697
}
98+
99+
public void initPriorityIndex() {
100+
priorityIndex = -1;
101+
}
97102
}

src/main/java/org/casbin/jcasbin/model/Model.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,20 @@ public boolean addDef(String sec, String key, String value) {
6666
Assertion ast = new Assertion();
6767
ast.key = key;
6868
ast.value = value;
69+
ast.initPriorityIndex();
6970

7071
if (ast.value.equals("")) {
7172
return false;
7273
}
7374

7475
if (sec.equals("r") || sec.equals("p")) {
7576
ast.tokens = splitCommaDelimited(ast.value);
76-
for (int i = 0; i < ast.tokens.length; i ++) {
77+
for (int i = 0; i < ast.tokens.length; i++) {
7778
ast.tokens[i] = key + "_" + ast.tokens[i];
79+
80+
if ("p_priority".equals(ast.tokens[i])) {
81+
ast.priorityIndex = i;
82+
}
7883
}
7984
} else {
8085
ast.value = Util.removeComments(Util.escapeAssertion(ast.value));
@@ -207,14 +212,17 @@ public void printModel() {
207212
* sort policies by priority value
208213
*/
209214
public void sortPoliciesByPriority() {
210-
if (model.containsKey("p")) {
211-
for (Map.Entry<String, Assertion> entry : model.get("p").entrySet()) {
212-
Assertion assertion = entry.getValue();
213-
if (!(entry.getKey() + "_priority").equals(assertion.tokens[0])) {
214-
continue;
215-
}
216-
assertion.policy.sort(Comparator.comparingInt(p -> Integer.parseInt(p.get(0))));
215+
if (!model.containsKey("p")) {
216+
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;
217224
}
225+
assertion.policy.sort(Comparator.comparingInt(p -> Integer.parseInt(p.get(priorityIndex))));
218226
}
219227
}
220228

src/main/java/org/casbin/jcasbin/model/Policy.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,16 @@ public boolean addPolicy(String sec, String ptype, List<String> rule) {
182182
if (!hasPolicy(sec, ptype, rule)) {
183183
Assertion assertion = model.get(sec).get(ptype);
184184
List<List<String>> policy = assertion.policy;
185+
int priorityIndex = assertion.priorityIndex;
185186

186187
// ensure the policies is ordered by priority value
187-
if ("p".equals(sec) && (ptype + "_priority").equals(assertion.tokens[0])) {
188-
int value = Integer.parseInt(rule.get(0));
188+
if ("p".equals(sec) && priorityIndex >= 0) {
189+
int value = Integer.parseInt(rule.get(priorityIndex));
189190
int left = 0, right = policy.size();
190191
// binary insert
191192
while (left < right) {
192193
int mid = (left + right) >>> 1;
193-
if (value > Integer.parseInt(policy.get(mid).get(0))) {
194+
if (value > Integer.parseInt(policy.get(mid).get(priorityIndex))) {
194195
left = mid + 1;
195196
} else {
196197
right = mid;

src/test/java/org/casbin/jcasbin/main/EnforcerUnitTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ public void testPriorityExplicit() {
514514
testEnforce(e, "data2_allow_group", "data2", "write", true);
515515

516516
// add a higher priority policy
517-
e.addPolicy("1", "bob", "data2", "write", "deny");
517+
e.addPolicy("bob", "data2", "write", "deny", "1");
518518

519519
testEnforce(e, "alice", "data1", "write", true);
520520
testEnforce(e, "alice", "data1", "read", true);

0 commit comments

Comments
 (0)