先上链接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将被加载
1 | bash复制代码mkdir demo && cd demo && go mod init github.com/51op/go-sdk-demo |
- 创建model模型文件model.conf
1 | ini复制代码[request_definition] |
上面模型文件规定了权限由sub
,obj
,act
三要素组成,只有在策略列表中有和它完全相同的策略时,该请求才能通过。匹配器的结果可以通过p.eft
获取,some(where (p.eft == allow))表示只要有一条策略允许即可
- 创建策略控制文件policy.csv
1 | bash复制代码p, demo , /user, write #demo用户对/user有write权限 |
- 检查权限
1 | go复制代码import ( |
可通过官网的编辑器直接运行查看结果,【直达链接】
实战项目 参考
有些代码未做抽取勿喷
- 目录结构如下:
1 | go复制代码dnspod/ |
- 首先在
configs目录下创建
model.conf`文件,写入如下代码:
1 | ini复制代码#此文件存储访问模型 |
- 在
api/internal/model
目录下,创建casbin.go
文件
1 | go复制代码package model |
- 在common/目录下的global.go文件中增加如下:
1 | Go复制代码func InitCasbinDB() *casbin.Enforcer { |
- 在router/下的route.go增加请求
1 | go复制代码 common.InitCasbinDB() //初始化 InitCasbinDB |
- router/handler目录下的func.go中增加AddPolicy
1 | go复制代码//Casbin 权限管理 |
- 在api/目录下创建casbiniapi.go文件
1 | go复制代码package api |
最后启动项目
验证
查看mysql库里数据就有了
- 权限验证通过后处理正常业务逻辑
增加访问入口
1 | go复制代码 |
测试业务逻辑
1 | go复制代码func TestListPolicics(c *gin.Context) { |
增加casbin中间件
1 | go复制代码//casbin中间件 |
在当前mysql库中没有 p /api/v1/auth/testPolicy GET
策略的时候执行这个api会返回没有权限
添加api/v1/auth/addPolicy
权限
然后在执行/api/v1/auth/testPolicy
这个接口已经有权限了
- 查询角色下的权限
1 | go复制代码authGroup.POST("/listPolicy",handler.GetListPolicy) //获取当前用户下的所有策略 |
1 | go复制代码 |
1 | go复制代码 |
基于RBAC权限认证
model模型中要修匹配器如下:
1 | go复制代码//使用keyMatch函数,这种情况下才能匹配传递不通参数的用户来匹配不同用户的权限,/api/v1/auth/testPolicy/user1、/api/v1/auth/testPolicy/user2 |
- 增加角色
分为给用户分配单一角色
、给用户分配多个角色
1 | go复制代码//给单一用户分配单一角色 |
在目录./router/handler/func.go中增加路由
1 | go复制代码type UserRoleInfo struct { |
router/route.go中增加路由
1 | go复制代码 authGroup.POST("/AddRoleUser",handler.AddRoleUser) |
- 验证RBAC
查看数据库,就有了相对应的一条记录
- 给
角色member
分配测试uri的权限
查看数据库已有相对应的记录
分别请求/api/v1/auth/testPolicy/user1
和/api/v1/auth/testPolicy/user2
user1验证未通过
user2通过
【关注我】持续更新ing。。。。。。
本文转载自: 掘金