diff --git a/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java b/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java index 7594fb60..9c227da0 100644 --- a/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java +++ b/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java @@ -23,6 +23,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.BiPredicate; + import org.casbin.jcasbin.effect.DefaultEffector; import org.casbin.jcasbin.effect.Effect; import org.casbin.jcasbin.effect.Effector; @@ -618,6 +620,38 @@ public boolean enforceWithMatcher(String matcher, Object... rvals) { return enforce(matcher, rvals); } + /** + * addNamedMatchingFunc add MatchingFunc by ptype RoleManager + */ + public boolean addNamedMatchingFunc(String ptype, String name, BiPredicate fn){ + if(rmMap.containsKey(ptype)){ + DefaultRoleManager rm = (DefaultRoleManager) rmMap.get(ptype); + rm.addMatchingFunc(name, fn); + clearRmMap(); + if(autoBuildRoleLinks){ + buildRoleLinks(); + } + return true; + } + return false; + } + + /** + * addNamedMatchingFunc add MatchingFunc by ptype RoleManager + */ + public boolean addNamedDomainMatchingFunc(String ptype, String name, BiPredicate fn){ + if(rmMap.containsKey(ptype)){ + DefaultRoleManager rm = (DefaultRoleManager) rmMap.get(ptype); + rm.addDomainMatchingFunc(name, fn); + clearRmMap(); + if(autoBuildRoleLinks){ + buildRoleLinks(); + } + return true; + } + return false; + } + private void getRTokens(Map parameters, Object... rvals) { for (String rKey : model.model.get("r").keySet()) { if (!(rvals.length == model.model.get("r").get(rKey).tokens.length)) { diff --git a/src/main/java/org/casbin/jcasbin/rbac/DefaultRoleManager.java b/src/main/java/org/casbin/jcasbin/rbac/DefaultRoleManager.java index d944cceb..6f66ffe2 100644 --- a/src/main/java/org/casbin/jcasbin/rbac/DefaultRoleManager.java +++ b/src/main/java/org/casbin/jcasbin/rbac/DefaultRoleManager.java @@ -68,7 +68,7 @@ public DefaultRoleManager(int maxHierarchyLevel, final BiPredicate matchingFunc) { + public void addMatchingFunc(String name, BiPredicate matchingFunc) { this.matchingFunc = matchingFunc; } @@ -77,7 +77,7 @@ public void addMatchingFunc(BiPredicate matchingFunc) { * * @param domainMatchingFunc the domain matching function. */ - public void addDomainMatchingFunc(BiPredicate domainMatchingFunc) { + public void addDomainMatchingFunc(String name, BiPredicate domainMatchingFunc) { this.domainMatchingFunc = domainMatchingFunc; } diff --git a/src/test/java/org/casbin/jcasbin/main/RbacAPIWithPatternMatchUnitTest.java b/src/test/java/org/casbin/jcasbin/main/RbacAPIWithPatternMatchUnitTest.java index 7888679a..4917a4df 100644 --- a/src/test/java/org/casbin/jcasbin/main/RbacAPIWithPatternMatchUnitTest.java +++ b/src/test/java/org/casbin/jcasbin/main/RbacAPIWithPatternMatchUnitTest.java @@ -97,10 +97,9 @@ public void testImplicitPermissionAPIWithDomainMatch() { @Test public void testEnforceAPIWithAllMatchPatterns() { - final Enforcer e = new Enforcer("examples/rbac_with_all_pattern_model.conf"); - e.setAdapter(new FileAdapter("examples/rbac_with_all_pattern_policy.csv")); - e.setRoleManager(new DefaultRoleManager(10, BuiltInFunctions::keyMatch2, BuiltInFunctions::allMatch)); - e.loadPolicy(); + final Enforcer e = new Enforcer("examples/rbac_with_all_pattern_model.conf", "examples/rbac_with_all_pattern_policy.csv"); + e.addNamedMatchingFunc("g", "KeyMatch2", BuiltInFunctions::keyMatch2); + e.addNamedDomainMatchingFunc("g", "AllMatch", BuiltInFunctions::allMatch); testDomainEnforce(e, "alice", "domain1", "/book/1", "read", true); testDomainEnforce(e, "alice", "domain1", "/book/1", "write", false);