前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用数据库来配置Casbin,手把手教你整合GORM适配器

如何使用数据库来配置Casbin,手把手教你整合GORM适配器

作者头像
小锟哥哥
发布2022-05-10 08:54:31
3.2K0
发布2022-05-10 08:54:31
举报
文章被收录于专栏:GoLang全栈

之前使用的都是本地的配置文件来管理权限的。

如果你的项目很小,这基本也就够用了,但是稍微大一点的项目基本就不行了。

实际项目基本都是把权限这些和我们的用户路由关联起来的,所以我们这里就需要你从数据库里面读取数据了。

要想让 casbin 支持从数据库里面读取数据,需要使用到他的适配器。

在官方文档的”适配器“章节里面,我们能看到他支持很多的适配器,比如 XORM,GROM 等。

Gorm 和 Xorm 的适配器都是作者写了,其他的可能是别人提供的。

我们这里使用 Gorm 适配器。

配套Github代码

很开心的告诉大家,这个系列的文章我们会把代码开源到 Github 上,为大家学习的路上扫平一切障碍。

我们官方的 Github 代码阅读,地址如下:

代码语言:javascript
复制
https://github.com/GoLangStackDev/casbin-with-mysql-go.git

本文配套 tag 标记:GORM适配器

安装GORM依赖

如果你对 GORM 不熟悉的欢迎去我们另一个系列文章学习GORM的相关知识点。

看到这个系列我们默认你已经对 GORM 比较熟悉了。

Gorm 适配器的官方 Github 地址:https://github.com/casbin/gorm-adapter

要整合到我们工程里面需要安装依赖,命令如下:

代码语言:javascript
复制
go get github.com/casbin/gorm-adapter/v3

初始化 GORM

既然是基于 GORM 的适配器,那项目里面一定是需要继承 GORM 的。

依赖安装命令:

代码语言:javascript
复制
go get gorm.io/driver/mysql
go get gorm.io/gorm

关于 GORM 等这些代码,我们需要建一个包来统一管理。

我在工程里面新建了一个文件夹名为 lib,然后新建一个文件 DB.go。

这里就直接上代码了哈:

代码语言:javascript
复制
package lib

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

var Gorm *gorm.DB
func init()  {
 Gorm = InitGorm()
}
func InitGorm() *gorm.DB {
 dsn:="数据库用户名:密码@tcp(数据库IP:端口)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"
 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
}

我新建了一个全局变量 Gorm,用于存放 gorm 工具的指针,方便给 casbin 用。

整合到casbin

我们之前从本地去取配置文件,其实是使用的 casbin 默认内置的适配器 File Adapter。

现在我们要缓存 Gorm 的适配器,只需要修改 NewEnforcer 方法就可以了。

新建adapter

我们回到上一篇文章的中间件文件 mid.go 文件中,找到 RBAC 方法。

之前我们是这样的创建一个实例的:

代码语言:javascript
复制
e,_ := casbin.NewEnforcer("resources/model.conf","resources/policy.csv")

这样默认使用的是 File Adapter。

现在我们修改下:

代码语言:javascript
复制
adapter, _ := gormadapter.NewAdapterByDB(lib.Gorm)
e,_ := casbin.NewEnforcer("resources/model.conf", adapter)
// 必须执行
e.LoadPolicy()

这里我们使用 gormadapter 包新建一个适配器。

这样就可以了。

修改数据库里面的权限

换成 Gorm 适配器后,程序启动后会自动在数据库里面新建一张空表,名为:casbin_rule。

表结构如下:

此时如果你啥也不添加,你 API 访问任何资源都会没权限。

如果要和之前的权限判定一定的话,就需要在表里面加入 policy.csv 里面的内容,如下:

一定要注意里面的空格,否则你会莫名其妙的权限失灵!!!

重启生效

casbin 并不支持热更新生效,你在 casbin_rule 表里面加入的数据,并不会马上生效。

你可以选择重启程序让他生效,当然也可以通过代码,但是比较麻烦。

这里我们直接重启程序,再访问你的API,就和上一篇文章一样的效果了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配套Github代码
  • 安装GORM依赖
  • 初始化 GORM
  • 整合到casbin
    • 新建adapter
      • 修改数据库里面的权限
        • 重启生效
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档