本文最后更新于: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
| 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"
b := e.Enforce(sub, obj, act) if b { fmt.Println("通过") } else { fmt.Println("未通过") }
|
三、策略管理操作
1、查询所有授权规则
GetPolicy 获取策略中的所有授权规则。
1 2 3
| policy := e.GetPolicy() fmt.Println(policy)
|
2、查询是否存在授权规则
HasPolicy 确定是否存在授权规则。
1 2 3 4 5
| 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)
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)
removed := e.RemovePolicy("alice", "data1", "read") fmt.Println(removed) policy = e.GetPolicy() fmt.Println(policy)
|
5、修改授权规则
UpdatePolicy 把旧的政策更新到新的政策
1 2
| 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" "github.com/casbin/casbin/v2" xormadapter "github.com/casbin/xorm-adapter/v2" _ "github.com/go-sql-driver/mysql" )
func main() { a, err := xormadapter.NewAdapter("mysql", "root:123456@tcp(127.0.0.1:3306)/go_test", true) fmt.Println(a, err) 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)
|