Skip to content

Commit 1d89844

Browse files
authored
feat: support AddNamedPoliciesEx API (#417)
1 parent 4abeb4a commit 1d89844

File tree

6 files changed

+54
-4
lines changed

6 files changed

+54
-4
lines changed

src/main/java/org/casbin/jcasbin/main/InternalEnforcer.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,15 @@ boolean addPolicy(String sec, String ptype, List<String> rule) {
104104
/**
105105
* addPolicies adds rules to the current policy.
106106
*/
107-
boolean addPolicies(String sec, String ptype, List<List<String>> rules) {
107+
boolean addPolicies(String sec, String ptype, List<List<String>> rules, boolean autoRemoveRepeat) {
108+
if(autoRemoveRepeat) {
109+
for (List<String> rule : rules) {
110+
if(model.hasPolicy(sec, ptype, rule)) {
111+
model.removePolicy(sec, ptype, rule);
112+
}
113+
}
114+
}
115+
108116
if (mustUseDispatcher()) {
109117
dispatcher.addPolicies(sec, ptype, rules);
110118
return true;

src/main/java/org/casbin/jcasbin/main/ManagementEnforcer.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,20 @@ public boolean addNamedPolicy(String ptype, List<String> params) {
337337
* @return succeeds or not.
338338
*/
339339
public boolean addNamedPolicies(String ptype, List<List<String>> rules) {
340-
return addPolicies("p", ptype, rules);
340+
return addPolicies("p", ptype, rules, false);
341+
}
342+
343+
/**
344+
* addNamedPoliciesEx adds authorization rules to the current named policy.
345+
* If the rule already exists, the rule will not be added.
346+
* But unlike AddNamedPolicies, other non-existent rules are added instead of returning false directly
347+
*
348+
* @param ptype the policy type, can be "p", "p2", "p3", ..
349+
* @param rules the "p" policy rules.
350+
* @return succeeds or not.
351+
*/
352+
public boolean addNamedPoliciesEx(String ptype, List<List<String>> rules) {
353+
return addPolicies("p", ptype, rules, true);
341354
}
342355

343356
/**
@@ -616,7 +629,7 @@ public boolean addNamedGroupingPolicy(String ptype, String... params) {
616629
* @return succeeds or not.
617630
*/
618631
public boolean addNamedGroupingPolicies(String ptype, List<List<String>> rules) {
619-
return addPolicies("g", ptype, rules);
632+
return addPolicies("g", ptype, rules, false);
620633
}
621634

622635
/**

src/main/java/org/casbin/jcasbin/main/SyncedEnforcer.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,20 @@ public boolean addNamedPolicies(String ptype, List<List<String>> rules) {
614614
return runSynchronized(() -> super.addNamedPolicies(ptype, rules), READ_WRITE_LOCK.writeLock());
615615
}
616616

617+
/**
618+
* addNamedPoliciesEx adds authorization rules to the current named policy.
619+
* If the rule already exists, the rule will not be added.
620+
* But unlike AddNamedPolicies, other non-existent rules are added instead of returning false directly
621+
*
622+
* @param ptype the policy type, can be "p", "p2", "p3", ..
623+
* @param rules the "p" policy rules.
624+
* @return succeeds or not.
625+
*/
626+
@Override
627+
public boolean addNamedPoliciesEx(String ptype, List<List<String>> rules) {
628+
return runSynchronized(() -> super.addNamedPoliciesEx(ptype, rules), READ_WRITE_LOCK.writeLock());
629+
}
630+
617631
/**
618632
* updateNamedPolicy updates an authorization rule to the current named policy.
619633
*

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void testAddPolicy() {
4343

4444
@Test
4545
public void testAddPolicies() {
46-
boolean result = enforcer.addPolicies(SEC, PTYPE, singletonList(RULE));
46+
boolean result = enforcer.addPolicies(SEC, PTYPE, singletonList(RULE), false);
4747
assertTrue(result);
4848
}
4949

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,15 @@ public void testModifyPolicyAPI() {
126126

127127
e.updateNamedPolicy("p", asList("eve", "data2", "read"), asList("eve", "data4", "read"));
128128
testGetPolicy(e, asList(asList("eve", "data4", "read")));
129+
130+
e.addNamedPolicies("p", asList(asList("eve", "data4", "read"), asList("user1", "data1", "read")));
131+
testGetPolicy(e, asList(asList("eve", "data4", "read")));
132+
133+
e.addNamedPoliciesEx("p", asList(asList("eve", "data4", "read"), asList("user1", "data1", "read")));
134+
testGetPolicy(e, asList(asList("eve", "data4", "read"), asList("user1", "data1", "read")));
135+
136+
137+
129138
}
130139

131140
@Test

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ public void testModifyPolicyAPI() {
9191
e.removeFilteredPolicy(1, "data2");
9292

9393
testGetPolicy(e, asList(asList("eve", "data3", "read")));
94+
95+
e.addNamedPolicies("p", asList(asList("eve", "data3", "read"), asList("user1", "data1", "read")));
96+
testGetPolicy(e, asList(asList("eve", "data3", "read")));
97+
98+
e.addNamedPoliciesEx("p", asList(asList("eve", "data3", "read"), asList("user1", "data1", "read")));
99+
testGetPolicy(e, asList(asList("eve", "data3", "read"), asList("user1", "data1", "read")));
94100
}
95101

96102
@Test

0 commit comments

Comments
 (0)