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);

参考资料

https://github.com/casbin/jcasbin

posted on 2021-06-17 12:40  荣锋亮  阅读(264)  评论(0编辑  收藏  举报

导航