Gin框架入门-Casbin进阶之策略管理API使用方法

本文最后更新于:1 年前

一、Casbin 安装

1、安装

1
go get github.com/casbin/casbin/v2

2、在线编辑

您还可以使用在线编辑器 ( https://casbin.org/editor/ ) 在 Web 浏览器中编写您的 Casbin 模型和策略。

二、创建Casbin enforcer

Casbin使用配置文件来设置访问控制模式。

它有两个配置文件,model.conf和policy.csv。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。 Casbin的使用非常精炼。 基本上,我们只需要一个主要结构:enforcer。 当构建这个结构时,model.conf和policy.csv将被加载。

换句话说,要新建一个Casbin enforcer,你必须提供一个Model和一个Adapter。

1、Model.conf

Model规定了权限由 sub、obj、act三要素组成,只有在策略Policy列表中存在于请求Request完全相同的策略时,该请求才能通过。匹配器的结构通过 p.eft 获取, some(where (p.eft == allow)) 表示有任意一条 policy rule 满足, 则最终结果为 allow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 请求
# sub ——> 想要访问资源的用户角色(Subject)——请求实体
# obj ——> 访问的资源(Object)
# act ——> 访问的方法(Action: get、post...)
[request_definition]
r = sub,obj,act


# 策略(.csv文件p的格式,定义的每一行为policy rule;p为policy rule的名字。)
[policy_definition]
p = sub,obj,act


# 策略效果
[policy_effect]
e = some(where (p.eft == allow))
# 上面表示有任意一条 policy rule 满足, 则最终结果为 allow;p.eft它可以是allow或deny,它是可选的,默认是allow

# 匹配器
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

2、Policy.csv

Policy表示谁能对什么资源进行什么操作

1
2
p, linzy, data1, read
p, hhh, data2, write

linzy 对 资源 data1 有 read 权限
hhh 对 资源 data2 有 write 权限

3、创建enforcer

1)创建

NewEnforcer通过文件或DB创建一个enforcer

1
2
//使用Model文件和默认 FileAdapter
e := casbin.NewEnforcer("./test/model.conf", "./test/policy.csv")

2)检查权限

Enforce决定一个“subject”是否可以通过操作“action”访问一个“object”,输入参数通常是:(sub, obj, act)

1
2
3
4
5
6
7
8
9
10
11
12
sub := "linzy" // 需要访问资源的用户。
obj := "data1" // 将要被访问的资源。
act := "read" // 用户对资源的权限。
//Enforce决定一个“subject”是否可以通过操作“action”访问一个“object”,输入参数通常是:(sub, obj, act)
b := e.Enforce(sub, obj, act)
if b {
// 允许 linzy 读取 data 1
fmt.Println("通过")
} else {
// 拒绝请求,显示错误
fmt.Println("未通过")
}

三、策略管理操作

1、查询所有授权规则

GetPolicy 获取策略中的所有授权规则。

1
2
3
//GetPolicy获取策略中的所有授权规则。
policy := e.GetPolicy()
fmt.Println(policy)

2、查询是否存在授权规则

HasPolicy 确定是否存在授权规则。

1
2
3
4
5
//HasPolicy 确定是否存在授权规则。
hasPolicy := e.HasPolicy("linzy", "data1", "read")
fmt.Println(hasPolicy)
hasPolicy = e.HasPolicy("hhh", "data1", "read")
fmt.Println(hasPolicy)

3、添加授权规则

AddPolicy 向当前策略添加授权规则。 如果规则已经存在,函数返回false,并且不会添加规则。 否则,函数通过添加新规则并返回true。

1
2
3
4
5
6
7
8
9
policy := e.GetPolicy()
fmt.Println(policy)
//AddPolicy为当前策略添加一条授权规则。
//如果规则已经存在,函数返回false,规则不会被添加。
//否则函数通过添加新规则返回true。
added := e.AddPolicy("alice", "data3", "read")
fmt.Println(added)
policy = e.GetPolicy()
fmt.Println(policy)

4、删除授权规则

RemovePolicy 从当前策略中删除授权规则。

1
2
3
4
5
6
7
policy = e.GetPolicy()
fmt.Println(policy)
//RemovePolicy 从当前策略中删除授权规则。
removed := e.RemovePolicy("alice", "data1", "read")
fmt.Println(removed)
policy = e.GetPolicy()
fmt.Println(policy)

5、修改授权规则

UpdatePolicy 把旧的政策更新到新的政策

1
2
//UpdatePolicy 把旧的政策更新到新的政策
updated, err := e.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})

四、MySQL数据库搭配Model文件

1、创建SQLAdapter

我这里使用的是MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import (
"fmt"
"log"
//一定要选择casbin的v2版本 不然会报错
"github.com/casbin/casbin/v2"
xormadapter "github.com/casbin/xorm-adapter/v2"
_ "github.com/go-sql-driver/mysql"
)

func main() {
// NewAdapter是Adapter的构造函数
// dbSpecified为可选bool参数。默认值为false。
//这取决于您是否在dataSourceName中指定了一个现有的DB。
//如果dbSpecified == true,您需要确保dataSourceName中的DB存在。
//如果dbSpecified == false,适配器将自动创建名为"casbin"的数据库。
a, err := xormadapter.NewAdapter("mysql", "root:123456@tcp(127.0.0.1:3306)/go_test", true)
fmt.Println(a, err)
//NewEnforcer通过DB创建一个enforcer
e, err := casbin.NewEnforcer("./test/model.conf", a)
if err != nil {
log.Fatalf("error: enforcer: %s", err)
}
}

当前自动创建了”casbin_rule”的数据表,且数据表为空

2、添加单条授权规则

AddPolicy 向当前策略添加授权规则。 如果规则已经存在,函数返回false,并且不会添加规则。 否则,函数通过添加新规则并返回true。

1
2
added, _ := e.AddPolicy("linzy", "data1", "read")
fmt.Println(added)

3、添加多条授权规则

AddPolicy 向当前策略添加授权规则。 该操作本质上是原子的 因此,如果授权规则由不符合现行政策的规则组成, 函数返回false,当前政策中没有添加任何政策规则。 如果所有授权规则都符合政策规则,则函数返回true,每项政策规则都被添加到目前的政策中。

1
2
3
4
5
6
7
8
9
rules := [][]string{
{"jack", "data4", "read"},
{"katy", "data4", "write"},
{"leyo", "data4", "read"},
{"ham", "data4", "write"},
}

areRulesAdded, _ := e.AddPolicies(rules)
fmt.Println(areRulesAdded)

4、删除授权规则

RemovePolicy 从当前策略中删除授权规则。

1
2
removed, _ := e.RemovePolicy("leyo", "data4", "read")
fmt.Println(removed)

5、修改授权规则

UpdatePolicy 把旧的政策更新到新的政策

1
2
updated, _ := e.UpdatePolicy([]string{"jack", "data4", "read"}, []string{"linzy", "data3", "write"})
fmt.Println(updated)

6、查询所有授权规则

GetPolicy 获取策略中的所有授权规则。

1
2
s := e.GetPolicy()
fmt.Println(s)


Gin框架入门-Casbin进阶之策略管理API使用方法
https://gopherlinzy.github.io/2022/07/19/gin-Casbin2/
作者
孙禄毅
发布于
2022年7月19日
许可协议