Loading... # Casbin框架的使用 ## 一、Casbin简介 ### 什么是Casbin Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。 Casbin只负责访问控制。身份认证 authentication(即验证用户的用户名、密码),需要其他专门的身份认证组件负责。 ### 访问控制模型 #### UGO(User,Group,Other) linux基于资源进行权限管理的访问模型。对资源设置三种访问权限(文件的创建者,创建者所在组,其他人) 缺点:只能为一类用户设置权限,对这类用户中的特殊人无能为力 #### ACL(访问控制列表) 每个资源都配置了一个列表,这个列表记录那些用户能够对这个资源进行操作。 关键数据模型有:用户,权限 缺点:资源的权限需要在用户间切换的成本极大;用户数或资源的数量增长 ,维护成本增加。 ##### 应用 1.文件系统:对文件和文件夹定义账号或群组对文件的操作权限 2.网络访问:服务器限制对指定端口的访问 #### RBAC(基于角色的权限访问控制) 用户-角色-权限,用户和角色是多对多的关系,角色和权限是多对多的关系,一个用户是否有某个权限,取决于该角色是否有某个权限。 #### ABAC(基于属性的权限验证) 权限和资源于当时的属性有关,属性值可以用于判断 ##### 应用 1.论坛的评论权限 2.github私有库 3.发帖者能够编辑、删除评论 4.微信聊天消息超过2分钟不能撤回 #### 工作原理 Casbin是基于PERM元模型(Policy, Effect, Request, Matchers) [策略,效果,请求,匹配器], 反映了权限的本质 C 访问控制 - Policy: 定义权限的规则 - Effect: 定义组合了多个 Policy 之后的结果, allow/deny - Request: 访问请求, 也就是谁想操作什么 - Matcher: 判断 Request 是否满足 Policy 匹配来源:定义的 request 和 存储的 police 比对判断。 所有 model file 中主要就是定义 PERM 4 个部分的一个文件( model.conf , 这个文件一般是固定的)。 ## 二、Casbin的使用 ### 安装 ``` go get github.com/casbin/casbin ``` ### ACL授权验证模型 #### 编写简单的模型文件 具体语法查看[model语法](https://casbin.org/zh/docs/syntax-for-models) `model可以从代码中加载,也可以从conf文件中加载。model只能动态加载,不能在运行时修改` > exp:demo_models.conf ``` # Request definition [request_definition] r = sub, obj, act # Policy definition [policy_definition] p = sub, obj, act # Policy effect [policy_effect] e = some(where (p.eft == allow)) # Matchers [matchers] m = r.sub == p.sub && r.obj == p.obj && r.act == p.act ``` #### 编写策略文件 > exp:Policy.csv ``` p, dajun, data1, read p, lizi, data2, write ``` 有一条 `p(策略)`,定义了 `dajun(sub), data1(obj), read(act)`,语义化就是 `dajun` 可以对 `data1` 执行 `read` 方法 #### code ``` package main import ( "fmt" "github.com/casbin/casbin/v2" "log" ) 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("casbin_demo/model.conf", "casbin_demo/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") } ``` ![1678432473123.png](http://type.zimopy.com/usr/uploads/2023/03/1111717797.png) 最后修改:2023 年 03 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏