首页 > 其他分享 >casbin快速入门:grom适配器管理策略

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

时间:2023-11-24 19:06:39浏览次数:41  
标签:obj sub err grom casbin 适配器 fmt gorm

一、概述

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


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

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

二、添加适配器代码

1、代码目录结构:

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

casbin快速入门:grom适配器管理策略_casbin_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适配器管理策略_数据库_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框架,我们该如何操作呢。后续有时间我们在简单整合一些拦截路由的小例子。


标签:obj,sub,err,grom,casbin,适配器,fmt,gorm
From: https://blog.51cto.com/xiaoluoge/8550862

相关文章

  • RS808-ASEMI通用60瓦以内适配器桥堆RS808
    编辑:llRS808-ASEMI通用60瓦以内适配器桥堆RS808型号:RS808品牌:ASEMI封装:RS-4正向电流:8A反向电压:800V引线数量:4芯片个数:4芯片尺寸:95MIL漏电流:<5ua恢复时间:>500ns浪涌电流:250A芯片材质:正向电压:1.10V封装尺寸:如图特性:插件、薄体扁桥工作结温:-55℃~150℃包装方式:500/......
  • RS307-ASEMI通用60瓦以内适配器桥堆RS307
    编辑:llRS307-ASEMI通用60瓦以内适配器桥堆RS307型号:RS307品牌:ASEMI封装:RS-4正向电流:3A反向电压:1000V引线数量:4芯片个数:4芯片尺寸:60MIL漏电流:<5ua恢复时间:>500ns浪涌电流:80A芯片材质:正向电压:1.10V封装尺寸:如图特性:插件、薄体扁桥工作结温:-50℃~150℃包装方式:500/......
  • 适配器模式
    [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。实验要求:画出对应的类图;提交源代码;Adapter.javapackagerobot;publicclassAdapterimplementsCat,Dog{privateCatcat=newRealcat();privateDogdog=newRealdog();publicv......
  • 每日随笔——适配器模式
    [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。实验要求:1.画出对应的类图;2.提交源代码;3.注意编程规范。类图 源码:Catpackagesc8;publicinterfacecat{voidcatchMouse();voidcry();}Dogpackagesc8;publicinter......
  • 趣解适配器模式之《买了苹果笔记本的尴尬》
    〇、小故事小王考上了理想的大学,为了更好的迎接大学生活,他决定买一台苹果的笔记本电脑犒赏自己。电脑很快买好了,用起来也非常的流畅,但是,当他想要插U盘传资料的时候,尴尬的事情来了,这台电脑两侧的插口非常少,只有1个耳机插孔和2个雷电插孔,根本没有USB插口!这咋办呀?他赶快咨询了他的哥哥......
  • 软件设计实验8:适配器模式
    实验8:适配器模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解适配器模式的动机,掌握该模式的结构;2、能够利用适配器模式解决实际问题。 [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。实验要求:1. 画出对应的类图; 2.......
  • 适配器模式和桥接模式代码
    适配器模式和桥接模式代码适配器模式[实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。packagetest8;interfaceCat{voidcatchMouse();}packagetest8;interfaceDog{voidbark();}packagetest8;//具体的猫类class......
  • 设计模式实验8,9 适配器模式,桥接模式
    适配器模式:实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。 ......
  • Windows 下 ORA-12560: TNS: 协议适配器错误的问题
    Windows下ORA-12560:TNS:协议适配器错误的问题原因有三个: 1.监听服务没有起起来。windows平台个一如下操作:开始---程序---管理工具---服务,打开服务面板,启动oraclehome92TNSlistener服务。 2.databaseinstance没有起起来。windows平台如下操作:开始---程序---管理工具---服务,......
  • java设计模式之适配器模式
    定义将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。......