前言
感谢开源项目gin-vue-admin,以及1010工作室的视频教程
本人学识尚浅,如有错误,请评论指出,谢谢!
详细可见个人博客:https://linzyblog.netlify.app/
一、Casbin 安装
1、安装
go get github.com/casbin/casbin/v2
2、在线编辑
您还可以使用在线编辑器 ( https://casbin.org/editor/ ) 在 Web 浏览器中编写您的 Casbin 模型和策略。
二、创建Casbin enforcer
Casbin使用配置文件来设置访问控制模式。
它有两个配置文件,model.conf和policy.csv。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。 Casbin的使用非常精炼。 基本上,我们只需要一个主要结构:enforcer。 当构建这个结构时,model.conf和policy.csv将被加载。
换句话说,要新建一个Casbin enforcer,你必须提供一个Model和一个Adapter。
1、Model.conf
Model规定了权限由 sub、obj、act三要素组成,只有在策略Policy列表中存在于请求Request完全相同的策略时,该请求才能通过。匹配器的结构通过 p.eft 获取, some(where (p.eft == allow)) 表示有任意一条 policy rule 满足, 则最终结果为 allow
# 请求 # sub ——> 想要访问资源的用户角色(Subject)——请求实体 # obj ——> 访问的资源(Object) # act ——> 访问的方法(Action: get、post...) [request_definition] r = sub,obj,act # 策略(.csv文件p的格式,定义的每一行为policy rule;p为policy rule的名字。) [policy_definition] p = sub,obj,act # 策略效果 [policy_effect] e = some(where (p.eft == allow)) # 上面表示有任意一条 policy rule 满足, 则最终结果为 allow;p.eft它可以是allow或deny,它是可选的,默认是allow # 匹配器 [matchers] m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
2、Policy.csv
Policy表示谁能对什么资源进行什么操作
p, linzy, data1, read p, hhh, data2, write
linzy 对 资源 data1 有 read 权限
hhh 对 资源 data2 有 write 权限
3、创建enforcer
1)创建
NewEnforcer通过文件或DB创建一个enforcer
//使用Model文件和默认 FileAdapter e := casbin.NewEnforcer("./test/model.conf", "./test/policy.csv")
2)检查权限
Enforce决定一个“subject”是否可以通过操作“action”访问一个“object”,输入参数通常是:(sub, obj, act)
sub := "linzy" // 需要访问资源的用户。 obj := "data1" // 将要被访问的资源。 act := "read" // 用户对资源的权限。 //Enforce决定一个“subject”是否可以通过操作“action”访问一个“object”,输入参数通常是:(sub, obj, act) b := e.Enforce(sub, obj, act) if b { // 允许 linzy 读取 data 1 fmt.Println("通过") } else { // 拒绝请求,显示错误 fmt.Println("未通过") }
三、策略管理操作
1、查询所有授权规则
GetPolicy 获取策略中的所有授权规则。
//GetPolicy获取策略中的所有授权规则。 policy := e.GetPolicy() fmt.Println(policy)
2、查询是否存在授权规则
HasPolicy 确定是否存在授权规则。
//HasPolicy 确定是否存在授权规则。 hasPolicy := e.HasPolicy("linzy", "data1", "read") fmt.Println(hasPolicy) hasPolicy = e.HasPolicy("hhh", "data1", "read") fmt.Println(hasPolicy)
3、添加授权规则
AddPolicy 向当前策略添加授权规则。 如果规则已经存在,函数返回false,并且不会添加规则。 否则,函数通过添加新规则并返回true。
policy := e.GetPolicy() fmt.Println(policy) //AddPolicy为当前策略添加一条授权规则。 //如果规则已经存在,函数返回false,规则不会被添加。 //否则函数通过添加新规则返回true。 added := e.AddPolicy("alice", "data3", "read") fmt.Println(added) policy = e.GetPolicy() fmt.Println(policy)
4、删除授权规则
RemovePolicy 从当前策略中删除授权规则。
policy = e.GetPolicy() fmt.Println(policy) //RemovePolicy 从当前策略中删除授权规则。 removed := e.RemovePolicy("alice", "data1", "read") fmt.Println(removed) policy = e.GetPolicy() fmt.Println(policy)
5、修改授权规则
UpdatePolicy 把旧的政策更新到新的政策
//UpdatePolicy 把旧的政策更新到新的政策 updated, err := e.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})
四、MySQL数据库搭配Model文件
1、创建SQLAdapter
我这里使用的是MySQL
import ( "fmt" "log" //一定要选择casbin的v2版本 不然会报错 "github.com/casbin/casbin/v2" xormadapter "github.com/casbin/xorm-adapter/v2" _ "github.com/go-sql-driver/mysql" ) func main() { // NewAdapter是Adapter的构造函数 // dbSpecified为可选bool参数。默认值为false。 //这取决于您是否在dataSourceName中指定了一个现有的DB。 //如果dbSpecified == true,您需要确保dataSourceName中的DB存在。 //如果dbSpecified == false,适配器将自动创建名为"casbin"的数据库。 a, err := xormadapter.NewAdapter("mysql", "root:123456@tcp(127.0.0.1:3306)/go_test", true) fmt.Println(a, err) //NewEnforcer通过DB创建一个enforcer e, err := casbin.NewEnforcer("./test/model.conf", a) if err != nil { log.Fatalf("error: enforcer: %s", err) } }
当前自动创建了"casbin_rule"的数据表,且数据表为空
2、添加单条授权规则
AddPolicy 向当前策略添加授权规则。 如果规则已经存在,函数返回false,并且不会添加规则。 否则,函数通过添加新规则并返回true。
added, _ := e.AddPolicy("linzy", "data1", "read") fmt.Println(added)
3、添加多条授权规则
AddPolicy 向当前策略添加授权规则。 该操作本质上是原子的 因此,如果授权规则由不符合现行政策的规则组成, 函数返回false,当前政策中没有添加任何政策规则。 如果所有授权规则都符合政策规则,则函数返回true,每项政策规则都被添加到目前的政策中。
rules := [][]string{ {"jack", "data4", "read"}, {"katy", "data4", "write"}, {"leyo", "data4", "read"}, {"ham", "data4", "write"}, } areRulesAdded, _ := e.AddPolicies(rules) fmt.Println(areRulesAdded)
4、删除授权规则
RemovePolicy 从当前策略中删除授权规则。
removed, _ := e.RemovePolicy("leyo", "data4", "read") fmt.Println(removed)
5、修改授权规则
UpdatePolicy 把旧的政策更新到新的政策
updated, _ := e.UpdatePolicy([]string{"jack", "data4", "read"}, []string{"linzy", "data3", "write"}) fmt.Println(updated)
6、查询所有授权规则
GetPolicy 获取策略中的所有授权规则。
s := e.GetPolicy() fmt.Println(s)