之前使用的都是本地的配置文件来管理权限的。
如果你的项目很小,这基本也就够用了,但是稍微大一点的项目基本就不行了。
实际项目基本都是把权限这些和我们的用户路由关联起来的,所以我们这里就需要你从数据库里面读取数据了。
要想让 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,就和上一篇文章一样的效果了。