gin框架学习-Casbin进阶之策略管理API使用方法

前言

感谢开源项目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)

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lin钟一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值