Casbin 使用详细介绍

2021-02-14 language golang

Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,注意,其只负责权限控制,没有用户管理的实现。

简介

权限管理的本质,是在询问 “某用户,对某资源,是否可以进行某操作” 。

Casbin 是一个强大、高效的访问控制库,支持常用的多种访问控制模型,如 ACL RBAC ABAC 等,可以实现灵活的访问权限控制,而且支持多种编程语言。

基本概念

Casbin 将访问控制模型抽象到一个基于 PERM (Policy Effect Request Matchers) 元模型的模型文件,如果要切换或更新授权机制只需要简单地修改配置文件即可,如下是基本概念介绍:

  • Policy 策略,定义了具体的规则。
  • Effect 根据对请求运用匹配器得出的所有结果进行汇总,来决定该请求是允许还是拒绝。
  • Request 是对访问请求的抽象,它与 e.Enforce() 函数的参数是一一对应的
  • Matcher 匹配器会将请求与定义的每个 policy 一一匹配,生成多个匹配结果。

在使用时包含了两个配置文件 model.conf 以及 policy.csv ,分别定义了具体的模型,以及配置的相关策略。

使用介绍

其中模型文件定义如下。

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

[policy_effect]
e = some(where (p.eft == allow))

request_definition

规定了权限由 sub obj act 三要素组成,分别是访问主体 Subject、被访问的资源 Object、访问方法 Action,通常会使用这三个的简写。

policy_definition

用来定义策略列表中的顺序,在策略文件 policy.csv 中就可以定义 p, guest, /foobar, GET 等价于 p = guest, /foobar, GET ,表示 guest 用户可以以 GET 方法访问 /foobar 路径。

最后的匹配结果默认通过 p.eft 获取,默认是 allow ,也可以通过 p = sub, obj, act, eft 显示指定,这样规则文件最后一列就要显示指定 allow 或者 deny 了。

matchers

定义了请求与规则的匹配策略,也就是需要完全匹配。

policy_effect

当有多个策略时如何匹配,这里的规则是 e = some(where (p.eft == allow)) ,也就意味着只要有一条匹配策略就表示允许。还有一种 e = some(where (p.eft == allow)) && !some(where (p.eft == deny)) 规则表示存在一个规则是 allow ,而其它规则不能是 deny

然后,策略文件定义为。

p, andy, data1, read
p, lili, data2, write

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

示例详解

这里以 Casbin Example 为例。

参考