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

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

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

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

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

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

我们这里使用 Gorm 适配器。

配套Github代码

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

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

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

安装GORM依赖

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

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

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

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

初始化 GORM

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

依赖安装命令:

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

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

这里就直接上代码了哈:

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

整合到casbin

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

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

新建adapter

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

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

这样默认使用的是 File Adapter。

现在我们修改下:

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

这样就可以了。

修改数据库里面的权限

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

表结构如下:

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

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

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

重启生效

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

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

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