Casbin 进行权限控制验证

install
go get github.com/casbin/casbin/v2
配置model

权限控制主要的三要素:sub(用户),obj(资源),act(操作)
request_definition:定义请求的要素
policy_definition:定义策略的要素
role_definition:定义角色继承关系
matchers:权限匹配逻辑
policy_effect:可以对matchers匹配的结果进行再次验证

[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
配置policy

p代表权限,g代表管理员
alice 具备data1的read(g的subject和p的subject相同,实现了在原有的角色上添加额外的权限)和data2的read&write
xie 的权限和alice一样(角色还能继承)。由于角色的继承和分配的位置是同一个,所以你很难直接看出来这是继承角色,还是分配角色。所以一般在角色前面加上Role(如:Role::admin)

p, alice, data1, read
p, bob, data2, write
p, data2_admin, data2, read
p, data2_admin, data2, write
g, alice,data2_admin
g, xie,alice
权限验证

使用 NewEnforcer 加载 model 和 policy 得到执行者
执行者通过Enforce(sub,obj,act) 来判断是否可执行

package main

import (
	"fmt"
	"github.com/casbin/casbin/v2"
)

func main() {
	enforcer, err := casbin.NewEnforcer("/Users/xieruixiang/go/src/good/model.conf", "/Users/xieruixiang/go/src/good/rbac_policy.csv")
	if err != nil {
		panic(err)
	}
	ok, err := enforcer.Enforce("alice", "data1", "read")
	if err != nil {
		panic(err)
	}
	fmt.Println(ok)
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值