jcasbin RoleManager问题
jcasbin的好多设计与golang的还是有些差异的,造成的问题就很明显了与golang 使用方法有差异
部分golang 的业务处理模式不能无缝的移植到java版本,RoleManager 就存在类似的问题
golang 实现
官方golang 的实现提供了一个默认RoleManager,类似其他语言也都实现了基本RoleManager接口定义,有些是没有实现
以下的
<wiz_code_mirror>
// AddMatchingFunc support use pattern in g
func (rm *RoleManager) AddMatchingFunc(name string, fn MatchingFunc) {
rm.hasPattern = true
rm.matchingFunc = fn
}
// AddDomainMatchingFunc support use domain pattern in g
func (rm *RoleManager) AddDomainMatchingFunc(name string, fn MatchingFunc) {
rm.hasDomainPattern = true
rm.domainMatchingFunc = fn
}
而且有点不太好的是,官方对于name 的定义没有明确的说明(理论上也是可以不需要的),所以好多语言在自己实现的时候
就有差异了(比如nodejs 可传可不传),java 实现就没有,但是可以通过构造函数初始化
问题
因为jcasbin 没有实现默认的AddMatchingFunc 以及AddDomainMatchingFunc 所以如果我们代码集成就需要自己调用下
enforcer.loadPolicy(); 不能保持和golang 语言的一致
解决方法
应用添加实现,后然用户就可以参考golang 的模式进行配置了,参考代码
添加功能(DefaultRoleManager)
public void AddMatchingFunc(String name,BiPredicate<String, String> matchingFunc){
this.matchingFunc=matchingFunc;
}
public void AddDomainMatchingFunc(String name,BiPredicate<String, String> domainMatchingFunc){
this.domainMatchingFunc=domainMatchingFunc;
}
调用
MyDemoFunc2 myDemoFunc = new MyDemoFunc2();
Enforcer enforcer = new Enforcer("src/main/resources/model2.conf","src/main/resources/policy2.csv",true);
// enforcer.setRoleManager(new DefaultRoleManager(20,MyDemoFunc2::mymatch, MyDemoFunc2::myKeyMatch));
// enforcer.loadPolicy();
((DefaultRoleManager)enforcer.getRoleManager()).AddDomainMatchingFunc("demo",MyDemoFunc2::myKeyMatch);
enforcer.addFunction(myDemoFunc.getName(),myDemoFunc);
// List<List<String>> result3= enforcer.getImplicitPermissionsForUser("alice");
//List<String> result3= enforcer.getImplicitRolesForUser("alice");
List<String> result3= enforcer.getRolesForUserInDomain("alice","domain3");
System.out.println(result3);