cassbin文件,

  cassbin文件,

  凯斯宾是一个强大、高效的访问控制库。支持常用的多种访问控制模型,如ACL/RBAC/ABAC等。可以实现灵活的访问权限控制。同时、卡斯宾支持多种编程语言,Go/Java/Node/PHP/Python/.净/锈。本文以去作为示例进行描述。

  一、例子一先来看第一个例子,在这个例子中,我们控制用户名为"管理"的用户对网路径"/user/* ",有"获取"的访问权限,用户"用户"对网路径"/商品/清单"有《邮报》访问权限,用户"根"对一切都有访问权限。

  1.引入库要求github.com/casbin/casbin版本1.9.1 2。访问控制模型(ABAC _模型。conf)[request _ definition]r=user,path,method[policy _ definition]p=user,path,method[policy _ effect]e=some(where(p . eft==allow))[matchers]m=r . user==p . user key match(r . path,p . path)r . method==p . method r . user== root 3 .访问策略(abac_policy.csv) p,admin,/user/*,getp,user,/goods/list,post 4 .程序包主要进口( github。com/cas bin/cas bin log )func main(){ e:=cas bin .NewEnforcer(./abac_model.conf , ./ABAC _政策。CSV )Enforce:=e . Enforce( a ,/user/list , get)log .Printf(a ,/user/list , get-%v\n ,enforce)enforce=e.Enforce(a ,/user/add , get)log .printf( a ,/user/add , get-%v\n ,Enforce)Enforce=e . Enforce( admin ,/user/add , get)log .Printf(admin ,/user/add , get-%v\n ,Enforce)Enforce=e . Enforce( admin ,/user/add , get )日志.Printf(admin ,/user/add , get-%v\n ,Enforce)Enforce=e . Enforce( admin ,/user/list , get )日志.Printf(admin ,/user/list , get-%v\n ,Enforce)Enforce=e . Enforce( admin ,/user/add , post )日志.printf( admin ,/user/add , post-%v\n ,Enforce)Enforce=e . Enforce( admin ,/goods/list , post )日志Printf( admin ,/goods/list , post-%v\n ,Enforce)Enforce=e . Enforce( user ,/user/add , get)log .Printf(user ,/user/add , get-%v\n ,Enforce)Enforce=e . Enforce( user , goods/list , get)log .printf( user , goods/list , get-%v\n ,Enforce)Enforce=e . Enforce( user ,/goods/list , post )日志.printf( user ,/goods/list , post-%v\n ,Enforce=e . Enforce( root ,/user/add , get )日志.Printf(root ,/user/add , get-%v\n ,Enforce)Enforce=e . Enforce( root , goods/list , get)log .printf( root , goods/list , get-%v\n ,Enforce)Enforce=e . Enforce( root ,/goods/list , post)log .printf( root ,/goods/list , post-%v\n ,Enforce=e . Enforce( root ,/aa/add , post )日志.Printf(root ,/aa/add , post-%v\n ,enforce)} 5 .结果2021/05/30 17:42:09 a ,/user/list , get-false2021/05/30 17:42:09 a ,/user/add , get -false 2021/05/30 17:42:09 admin ,/user/add , get -true 2021/05/30 17:42:09 admin ,/user/add , get -true 2020说明其实凯斯宾的使用非常简单

  第一步,初始化一个执行者:

  e:=casbin .NewEnforcer(./abac_model.conf , ./ABAC _政策。CSV’)

  第二步,对输入参数进行验证,例如:

  enforce :=e.Enforce("a ","/user/list "," get ")

  通过观察输出结果,我们可以看到,我们实现了我们要达到的访问控制效果。那么整个过程是怎么实现的呢,下面我们来详细说明下。

  二、访问控制模型首先我们来看访问控制模型(abac_model.conf),在这个文件中,我们定义了访问控制的规则:

  1.请求定义在模型中。[request_definition]后面的一行是请求定义,它定义了我们的输入参数,也就是方法e.enforce ("a ","/user/list "," get "),以及每个参数的含义。例如,在上面的例子中,第一个参数是用户名,第二个参数是web访问路径,第三个应该注意的是,在验证过程中,传入的参数必须与模型中定义的参数一致。

  2.策略定义策略定义以[policy_definition]开头,后面的内容就是策略定义。这里定义了每个策略的每个子项的含义。在上面的示例中,它定义了一个策略,其中第一项是用户名,第二项是web访问路径,第三项是访问方法。以后制定政策的时候要遵循这个定义。例如,在上面的例子中,可以看到在策略文件中,用户名、web访问路径和访问方法跟在p后面。

  3.策略效果策略效果从【policy_effect】开始,用来解释每个匹配结果如何影响最终结果。比如上面例子中的策略效果:e=some(where (p.eft==allow)),意思是只要有一条策略记录与请求参数匹配,最后的结果就是allow。

  4.matcher matcher以[matchers]开头,解释了如何匹配输入参数和策略记录,比如上面的例子(m=r . user==p . user key match(r . path,p . path)r . method==p . method r . user==" root ")。输入参数的用户名应等同于策略记录中的用户名,输入参数应匹配策略记录中的web访问路径,输入参数应等同于策略记录中的方法字段。如果同时满足这三个条件,则输入参数和策略记录匹配,结果为allow。或者“”符号表示前三个条件不同时满足,但是输入请求的用户名是root,那么输入请求匹配策略记录,结果是allow。特别是,您可以使用matcher中的函数,比如上面例子中的keyMatch,或者您可以自定义函数。具体请参考官方文件,此处不再赘述。

  三。策略记录策略记录是访问策略的记录,可以保存在文件或数据中,由不同的适配器实现。详情请参考官方文档中对适配器的描述。

  四。例2通过例1的分析,我们可以发现卡斯宾规则的定义是灵活的,我们可以自定义验证什么和如何验证。我们再举一个例子。我们现在有一个功能,只有ip地址以192.168开头的用户才能访问。

  1.访问控制模型(ABAC _模型. conf)[请求_定义] r=act,IP[策略_定义] p=act,IP[策略_效果] e=some(其中(p.eft==允许))[匹配] m=r.act==p.act密钥匹配(r.ip,p.ip) 3 .访问策略(abac_policy.csv) p,admin,192.168* 4。程序包主导入( github . com/cas bin/cas bin log )funcmain(){ E:=cas bin . new enforcer(。/ABAC _模型. conf ,。/ABAC _ policy . CSV )Enforce:=e . Enforce( admin , 192.168.0.11 )日志。printf( admin , 192.168.0.11-%v\n ,Enforce)Enforce=e . Enforce( admin , 192.167.0.11 )日志。printf( admin , 192.167.0.11-%v\n ,Enforce)Enforce=e . Enforce( manage , 192.168.0.11 )日志。printf( manage ,192.168.0.11-%v\n ,enforce)} 5。结果2021/05/30 20: 30: 23 admin , 192 . 168 . 0 . 11 -true 2021/05/30 192 . 167 . 0 . 11 -false 2021/05/30 20:30:23 manage , 192.168.0.11-false可以看出只有第一个请求是allow,第二个是由于ip地址不匹配,第三个是函数不匹配。

  5.分组受权限控制。我们经常有这样一个需求,就是希望可以定义一些角色,给这些角色赋予一定的权限,然后给用户分配一定的角色,让用户拥有角色所拥有的所有权限。要达到这种效果,卡斯宾应该怎么做?让我们看看下面的例子。

  1.访问控制模型(RBAC _模型. conf)[请求_定义] r=用户,路径,方法[策略_定义] p=角色,路径,方法[角色_定义] g=_,_[策略_效果]e=一些(其中(p.eft==允许))[匹配者]m=g(r .用户,p .角色)keyMatch(r .路径,p .路径)r .方法==p .方法2 .访问策略(RBAC _策略. csv) p,管理者,/用户/*,getp,销售者,/商品/货物结果管理,/用户/列表,get-trueadmin,/商品/列表,post-trueuser1,/用户/列表,get-false user1,/商品/列表,post-true4。说明了通过上面的例子,我们将[role_definition]添加到控制模型中,将g(r.user,p.role)添加到匹配器中,达到引入角色的目的。实际上g(r.user,p.role)的作用是从请求参数中取出用户参数,从策略记录中取出角色字段,然后与分组记录(访问策略文件中以g开头的记录)进行匹配。如果匹配g(r.user,p.role)的结果为真。

  不及物动词后记由于我是卡斯宾新人,如有不妥请留言指正。另外,卡斯宾在官网的地址如下:卡斯宾官网;官网提供的编辑可以用来验证保单记录是否正确:https://casbin.org/en/editor/

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: