go Casbin配置文件,以及匹配规则

今天学了一下casbin,对caspin的怎么匹配的有了心得,我自己的理解,相关资料也没有查询,只是为了把我的想法在此记录下来
文档地址:https://casbin.org/docs/zh-CN/overview
引用一下https://juejin.im/post/6844904191257739277#heading-1该文档的例子,我也是根据这个学的。

我们首先编写模型文件:

model.conf
[request_definition] //接收器,代码里调用e.Enforce(sub, obj, act)的时候,会把值赋给这几个参数
r = sub, obj, act

[policy_definition]//匹配器,用cvs文件赋值
p = sub, obj, act

[matchers]//匹配方法
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

[policy_effect]//匹配的结果通过p.eft获取,some(where (p.eft == allow))表示只要有一条策略允许即可。
e = some(where (p.eft == allow))

然后我们策略文件(即谁能对什么资源进行什么操作):

policy.csv
p, dajun, data1, read
p, lizi, data2, write

上面policy.csv文件的两行内容表示dajun对数据data1有read权限,lizi对数据data2有write权限。

然后代码

package main

import (
  "fmt"
  "log"

  "github.com/casbin/casbin/v2"
)

func check(e *casbin.Enforcer, sub, obj, act string) {
  ok, _ := e.Enforce(sub, obj, act)
  if ok {
    fmt.Printf("%s CAN %s %s\n", sub, act, obj)
  } else {
    fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
  }
}

func main() {
  e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
  if err != nil {
    log.Fatalf("NewEnforecer failed:%v\n", err)
  }

  check(e, "dajun", "data1", "read")
  check(e, "lizi", "data2", "write")
  check(e, "dajun", "data1", "write")
  check(e, "dajun", "data2", "read")
}
代码其实不复杂。首先创建一个casbin.Enforcer对象,
加载模型文件model.conf和策略文件policy.csv,
调用其Enforce方法来检查权限。

运行程序的结果:

dajun CAN read data1
lizi CAN write data2
dajun CANNOT write data1
dajun CANNOT read data2

这里看一下是如何判断的,以第一条为例

调用check(e, "dajun", "data1", "read"),配置文件写着r = sub, obj, act,此时,r = dajun,data1,read,把参数赋值给r
然后根据匹配规则做判断 m = r.sub == p.sub && r.obj == p.obj && r.act == p.act是否为true,因为policy.csv文件配置了2条策略,所以会依次做判断。
比如第一条策略是 p, dajun, data1, read。那么判断就是r.dajun == p.dajun&&r.data1==p.data1&&r.read == p.read,结果就是true
<think>好的,我需要帮助用户在Go中使用Casbin实现基于角色的访问控制(RBAC)。首先,我得回忆一下Casbin的基本概念和RBAC模型的结构。Casbin使用模型配置文件(model.conf)和策略文件(policy.csv)来定义访问控制规则。 用户提供的引用内容中有几个关键点。引用[1]提到ABAC的用法,但用户的问题是关于RBAC的,所以可能需要暂时忽略这部分。引用[2]和[3]给出了Go代码的示例,其中初始化了Enforcer并测试了权限。这应该是实现RBAC的核心步骤。 首先,用户需要创建一个模型配置文件(rbac_model.conf)。RBAC模型通常包括角色定义、资源、操作以及角色继承。例如,使用角色继承的话,可以通过g来定义角色层次结构,比如admin继承user的权限。然后,策略文件(rbac.csv)需要定义角色与用户的关系,以及角色对资源的访问权限。 接下来,在Go代码中,用户需要导入Casbin库,创建Enforcer实例,加载模型和策略文件。然后,使用Enforce方法来检查权限。引用[3]中的TestRBAC函数展示了如何初始化Enforcer并进行权限检查。需要注意的是,代码中的策略文件路径是否正确,以及错误处理是否完善。 用户可能需要了解如何动态添加或删除策略。例如,使用e.AddPolicy()或e.RemovePolicy()来管理策略。这部分在示例中没有提到,但实际应用中可能很重要,应该包含在回答中。 另外,引用中提到ABAC的部分可能让用户混淆,需要明确指出RBAC和ABAC的区别,确保用户不会误用操作符。同时,注意引用[1]提到某些版本不支持,但用户的问题是关于Go的实现,而引用中的代码是Go的,所以可以确认Go版本支持RBAC。 最后,生成相关问题时要围绕RBAC的实现、模型配置、策略管理和扩展功能展开,帮助用户深入理解。确保回答结构清晰,分步骤说明,代码示例正确,并引用提供的资料适当标注来源。</think>以下是如何在Go中使用Casbin实现基于角色的访问控制(RBAC)的分步说明: ### 1. 创建RBAC模型文件 新建`rbac_model.conf`文件定义访问控制逻辑: ``` [request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [role_definition] g = _, _ [policy_effect] e = some(where (p.eft == allow)) [matchers] m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act ``` 该模型实现: - `g = _, _` 定义角色继承关系 - 匹配规则要求用户角色、资源对象和操作都符合策略[^3] ### 2. 准备策略文件 创建`rbac.csv`策略文件: ``` p, admin, project, read p, admin, project, write g, alice, admin ``` 表示: - admin角色有project的读写权限 - 用户alice被赋予admin角色[^3] ### 3. 实现Go代码 ```go package main import ( "fmt" "log" "github.com/casbin/casbin/v2" ) func main() { e, err := casbin.NewEnforcer("rbac_model.conf", "rbac.csv") if err != nil { log.Fatalf("初始化失败: %v", err) } // 验证alice的权限 if ok, _ := e.Enforce("alice", "project", "read"); ok { fmt.Println("alice有读取权限") } // 动态添加策略 e.AddPolicy("manager", "report", "read") e.AddRoleForUser("bob", "manager") } ``` 代码说明: 1. 创建执行器加载模型和策略 2. 使用`Enforce`验证权限 3. 演示动态添加策略和角色[^2] ### 4. 高级功能 - **角色继承**:在策略文件添加`g, admin, user`实现角色继承 - **层级资源**:使用`keyMatch2`匹配路径参数 - **持久化**:配合数据库适配器存储策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值