先上链接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。。。。。。
本文转载自: 掘金