casbin最牛逼的权限管理
casbin能做什么?
支持多种编程语言Go/Java/Node/PHP/Python/.NET/Rust,一次学习多处运用
支持自定义请求格式,默认格式(subject,object,action)
具有访问控制模型model和策略policy两个核心概念
支持RBAC中的多层继承,不仅subject有角色,object也可以有角色
支持内置的超级用户,例如root或admin,超级用户可以执行任何操作而无需显式的权限声明
支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*
Casbin 不能做什么?
身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
管理用户列表或角色列表。 Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin 的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系
快速开始
Casbin使用配置文件来设置访问控制模式。
它有两个配置文件,model.conf
和policy.csv
。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。 Casbin的使用非常精炼。 基本上,我们只需要一个主要结构:enforcer。 当构建这个结构时,model.conf和policy.csv将被加载
mkdir demo && cd demo && go mod init github.com/51op/go-sdk-demo go get github.com/casbin/casbin/v2 复制代码
创建model模型文件model.conf
[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 || r.sub == "root" #只要访问主体是root一律放行。 [policy_effect] e = some(where (p.eft == allow)) 复制代码
上面模型文件规定了权限由sub
,obj
,act
三要素组成,只有在策略列表中有和它完全相同的策略时,该请求才能通过。匹配器的结果可以通过p.eft
获取,some(where (p.eft == allow))表示只要有一条策略允许即可
创建策略控制文件policy.csv
p, demo , /user, write #demo用户对/user有write权限 p, demo , /order, read #demo用户对/order有read权限 p, demo1 , /user/userlist,read #demo1用户对/user/userlist有read权限 p, demo2 , /order/orderlist,read #demo2用户对/order/orderlist有read权限 复制代码
检查权限
import ( "fmt" "github.com/casbin/casbin/v2" gormadapter "github.com/casbin/gorm-adapter/v3" _ "github.com/go-sql-driver/mysql" "log" "testing" ) func CheckPermi(e *casbin.Enforcer ,sub,obj,act string) { ok, err := e.Enforce(sub, obj, act) if err != nil { return } if ok == true { fmt.Printf("%s CAN %s %s\n", sub, act, obj) } else { fmt.Printf("%s CANNOT %s %s\n", sub, act, obj) } } func TestCasBin( t *testing.T) { e, err := casbin.NewEnforcer("./model.conf", "./policy.csv") if err !=nil{ log.Fatalf("NewEnforecer failed:%v\n", err) } //基本权限设置 CheckPermi(e, "demo", "/user", "read") CheckPermi(e, "demo", "/order", "write") CheckPermi(e, "demo1", "/user/userlist", "read") CheckPermi(e, "demo1", "/order/orderlist", "write") }
作者:SangX
链接:https://juejin.cn/post/7031734011638579213