Skip to content

Commit 564b800

Browse files
authored
feat: support batchAdapter (#10)
1 parent 472fa35 commit 564b800

File tree

4 files changed

+98
-4
lines changed

4 files changed

+98
-4
lines changed

pom.xml

+6-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
<dependency>
147147
<groupId>org.casbin</groupId>
148148
<artifactId>jcasbin</artifactId>
149-
<version>1.1.0</version>
149+
<version>1.31.2</version>
150150
</dependency>
151151
<dependency>
152152
<groupId>mysql</groupId>
@@ -165,6 +165,11 @@
165165
<version>8.2.2.jre8</version>
166166
<scope>test</scope>
167167
</dependency>
168+
<dependency>
169+
<groupId>commons-collections</groupId>
170+
<artifactId>commons-collections</artifactId>
171+
<version>3.2.2</version>
172+
</dependency>
168173
</dependencies>
169174

170175

src/main/java/org/casbin/adapter/CasbinRuleDao.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,20 @@ public interface CasbinRuleDao {
8787
@Insert("INSERT INTO casbin_rule (ptype,v0,v1,v2,v3,v4,v5) VALUES (#{ptype},#{v0},#{v1},#{v2},#{v3},#{v4},#{v5})")
8888
void insertData(CasbinRule line);
8989

90+
@Insert({"<script>",
91+
"INSERT INTO casbin_rule (ptype, v0, v1, v2, v3, v4, v5) VALUES ",
92+
"<foreach collection='list' item='item' separator=','>",
93+
"(#{item.ptype}, #{item.v0}, #{item.v1}, #{item.v2}, #{item.v3}, #{item.v4}, #{item.v5})",
94+
"</foreach>",
95+
"</script>"
96+
})
97+
void insertDataBatch(@Param("list") List<CasbinRule> rules);
98+
9099
@Insert("<script>" +
91100
"DELETE FROM casbin_rule WHERE ptype = #{ptype}" +
92101
"<foreach collection=\"list\" item=\"item1\" index=\"index\" separator=\" \">" +
93102
" AND v#{index} = #{item1}" +
94103
"</foreach>" +
95104
"</script>")
96105
void deleteData(@Param("ptype") String ptype, @Param("list") List<String> rules);
97-
98106
}

src/main/java/org/casbin/adapter/MybatisAdapter.java

+42-2
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@
1212
import org.casbin.jcasbin.model.Assertion;
1313
import org.casbin.jcasbin.model.Model;
1414
import org.casbin.jcasbin.persist.Adapter;
15+
import org.casbin.jcasbin.persist.BatchAdapter;
1516
import org.casbin.jcasbin.persist.Helper;
1617

1718
import javax.sql.DataSource;
1819
import java.util.*;
20+
import java.util.stream.Collectors;
1921

2022

2123
/**
2224
* MybatisAdapter is the Mybatis adapter for jCasbin.
2325
* It can load policy from Mybatis supported database or save policy to it.
2426
*/
25-
public class MybatisAdapter implements Adapter {
27+
public class MybatisAdapter implements Adapter, BatchAdapter {
2628
private String driver;
2729
private String url;
2830
private String username;
@@ -104,7 +106,7 @@ private String getUrl(String url){
104106
private void createDatabase(){
105107
SqlSession sqlSession = factory.openSession(true);
106108
CasbinRuleDao casbinRuleDao = sqlSession.getMapper(CasbinRuleDao.class);
107-
109+
108110
switch (driver) {
109111
case "com.mysql.cj.jdbc.Driver":
110112
casbinRuleDao.createMysqlDatabase("casbin");
@@ -285,6 +287,30 @@ public void addPolicy(String sec, String ptype, List<String> rule) {
285287
}
286288

287289

290+
/**
291+
* addPolicies adds policy rules to the storage.
292+
*
293+
* @param sec the section, "p" or "g".
294+
* @param ptype the policy type, "p", "p2", .. or "g", "g2", ..
295+
* @param rules the policy rules.
296+
*/
297+
@Override
298+
public void addPolicies(String sec, String ptype, List<List<String>> rules) {
299+
if(CollectionUtils.isEmpty(rules)) {
300+
return;
301+
}
302+
List<CasbinRule> casbinRules = rules.stream()
303+
.map(rule -> savePolicyLine(sec, rule))
304+
.distinct()
305+
.collect(Collectors.toList());
306+
307+
SqlSession sqlSession = factory.openSession(true);
308+
CasbinRuleDao casbinRuleDao = sqlSession.getMapper(CasbinRuleDao.class);
309+
casbinRuleDao.insertDataBatch(casbinRules);
310+
sqlSession.close();
311+
}
312+
313+
288314
/**
289315
* removePolicy removes a policy rule from the storage.
290316
*/
@@ -294,6 +320,20 @@ public void removePolicy(String sec, String ptype, List<String> rule) {
294320
removeFilteredPolicy(sec, ptype, 0, rule.toArray(new String[0]));
295321
}
296322

323+
/**
324+
* removePolicies removes some policy rules from the storage.
325+
*
326+
* @param sec the section, "p" or "g".
327+
* @param ptype the policy type, "p", "p2", .. or "g", "g2", ..
328+
* @param rules the policy rules.
329+
*/
330+
@Override
331+
public void removePolicies(String sec, String ptype, List<List<String>> rules) {
332+
rules.forEach(rule -> {
333+
removePolicy(sec, ptype, rule);
334+
});
335+
}
336+
297337
/**
298338
* removeFilteredPolicy removes policy rules that match the filter from the storage.
299339
*/

src/test/java/org/casbin/adapter/MybatisAdapterTest.java

+41
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,45 @@ public void testAddAndRemovePolicy() {
100100
a.loadPolicy(e.getModel());
101101
testEnforce(e, "cathy", "data1", "read", false);
102102
}
103+
104+
@Test
105+
public void testAddAndRemovePolicyBatch() {
106+
MybatisAdapter a = new MybatisAdapter(DRIVER, URL, USERNAME, PASSWORD);
107+
Enforcer e = new Enforcer("examples/rbac_model.conf", a);
108+
109+
// test addPolicies()
110+
e.clearPolicy();
111+
e.addPolicies(asList(
112+
asList("alice", "data1", "read"),
113+
asList("bob", "data2", "write"),
114+
asList("data2_admin", "data2", "read"),
115+
asList("data2_admin", "data2", "write")
116+
));
117+
e.clearPolicy();
118+
a.loadPolicy(e.getModel());
119+
testEnforce(e, "alice", "data1", "read", true);
120+
testEnforce(e, "bob", "data2", "write", true);
121+
testEnforce(e, "data2_admin", "data2", "read", true);
122+
testEnforce(e, "data2_admin", "data2", "write", true);
123+
124+
// test removePolicies()
125+
e.clearPolicy();
126+
a.savePolicy(e.getModel());
127+
e.addPolicies(asList(
128+
asList("alice", "data1", "read"),
129+
asList("bob", "data2", "write"),
130+
asList("data2_admin", "data2", "read"),
131+
asList("data2_admin", "data2", "write")
132+
));
133+
e.removePolicies(asList(
134+
asList("alice", "data1", "read"),
135+
asList("bob", "data2", "write")
136+
));
137+
e.clearPolicy();
138+
a.loadPolicy(e.getModel());
139+
testEnforce(e, "alice", "data1", "read", false);
140+
testEnforce(e, "bob", "data2", "write", false);
141+
testEnforce(e, "data2_admin", "data2", "read", true);
142+
testEnforce(e, "data2_admin", "data2", "write", true);
143+
}
103144
}

0 commit comments

Comments
 (0)