阅读 243

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.confpolicy.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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐