casbin快速入门:grom适配器管理策略
  DMGk6WNJGqlo 2023年11月25日 26 0

一、概述

上一讲我们已经讲了基础的策略管理。用配置文件来管理,在大型项目里肯定是不够的。所以这一讲我们讲一下用数据库来进行策略管理,我们选择Mysql。官方网站也给我们推荐了对应的适配器:


casbin快速入门:grom适配器管理策略_casbin

我们选择Grom这个适配器来进行管理,主要是我们后期使用gin框架,这个比较习惯:

二、添加适配器代码

1、代码目录结构:

我们在上次演示代码的基础上添加一个dao目录,用来添加grom连接,代码结构如下:

casbin快速入门:grom适配器管理策略_数据库_02

2、添加的db.go连接器:

package dao

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
)

const (
	Usernname = "root"
	Password  = "123456"
	Host      = "172.22.6.82"
	Port      = "3306"
	Db        = "casbin"
)

var Gorm *gorm.DB

func init() {
	Gorm = InitGorm()
}
func InitGorm() *gorm.DB {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", Usernname, Password, Host, Port, Db)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal(err)
	}
	mysqlDB, err := db.DB()
	if err != nil {
		log.Fatal(err)
	}
	mysqlDB.SetMaxIdleConns(5)
	mysqlDB.SetMaxOpenConns(10)
	return db
}

三、修改我们的main代码:

package main

import (
	"casbin-project/dao"
	"fmt"
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
)

func main() {
	sub := "test"
	obj := "/posts"
	act := "POST"

	a, err := gormadapter.NewAdapterByDB(dao.Gorm)
	e, err := casbin.NewEnforcer("resources/model.conf", a)
	checkError(err)
	ok, err := e.Enforce(sub, obj, act)
	checkError(err)
	if ok {
		fmt.Println("通过!")
	} else {
		fmt.Println("不通过!")
	}
}

// 统一错误检查
func checkError(err error) {
	if err != nil {
		println(err.Error())
	}
}

#执行一下我们这个代码,默认会在casbin这个数据库下生成一个:casbin_rule表默认表结构是空的:

casbin快速入门:grom适配器管理策略_github_03

我们执行代码现在是不通过的(以为我们的策略表现在是空的),下面我们给代码添加一条校验规则:test用户访问 /post资源执行POST方法:

四、执行插入策略:

1、执行: e.AddPolicy(sub, obj, act)添加策略

package main

import (
	"casbin-project/dao"
	"fmt"
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
)

func main() {
	sub := "test"
	obj := "/posts"
	act := "POST"

	a, err := gormadapter.NewAdapterByDB(dao.Gorm)
	e, err := casbin.NewEnforcer("resources/model.conf", a)
	checkError(err)
	added, err := e.AddPolicy(sub, obj, act)
	fmt.Println(added)

	ok, err := e.Enforce(sub, obj, act)
	checkError(err)
	if ok {
		fmt.Println("通过!")
	} else {
		fmt.Println("不通过!")
	}
}

// 统一错误检查
func checkError(err error) {
	if err != nil {
		println(err.Error())
	}
}

##我们再次执行发现已经是OK了,可以解析通过,我们看一下数据库是否已经变化:

casbin快速入门:grom适配器管理策略_github_04

#可以看到已经插入成功了相关的策略。到此用数据库来管理规则已经完成,当然还有更多优秀的API我们可以自行如下 

五、更多的API管理:

1、我们可以调用:e.RemovePolicy()加规则名:

rmed, err := e.RemovePolicy(sub, obj, act)

2、可以一次性添加多条规则:

rules := [][]string{
		[]string{"admin", "/post", "POST"},
		[]string{"test", "/test", "GET"},
		[]string{"test", "/test", "POST"},
		[]string{"xiaoluo", "/data", "GET"},
	}

	areRulesAdded, _ := e.AddPolicies(rules)
	fmt.Println(areRulesAdded)

3、删除多条规则同理:

rmed, err := e.RemovePolicies(rules)

六、总结完善:

官网提供了很多丰富的API接口文档,但是实际测试下来我们也发现:add添加规则等,照抄会报错。我们自己可以用goland查看一下源码看一下参数之类的进行修改。最后我们发现实际应用当中还有几个需要完善的地方例如:我们知道了casbin可以进行权限判断,那么在实际项目如何使用:例如gin框架,我们该如何操作呢。后续有时间我们在简单整合一些拦截路由的小例子。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
  dwHry2iKGG0I   2023年12月26日   28   0   0 githubgithubhtmlhtml
DMGk6WNJGqlo