gofiber-study/middleware/casbin.go
Shikong c5819c1ce6 添加 casbin model 定义
casbin 初始化 && 测试
2022-10-05 16:02:09 +08:00

57 lines
1.6 KiB
Go

package middleware
import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
"github.com/casbin/xorm-adapter/v2"
_ "github.com/go-sql-driver/mysql"
"gofiber.study.skcks.cn/common/logger"
"gofiber.study.skcks.cn/common/utils"
"gofiber.study.skcks.cn/global"
"gofiber.study.skcks.cn/model/casbin_model/models"
"xorm.io/xorm"
)
func NewCasbin(engine *xorm.EngineGroup) {
casbinModels := make([]models.CasbinModel, 0)
err := engine.Find(&casbinModels)
if err != nil {
logger.Log.Fatalf("[x] [casbin] model 加载失败: %s", err)
}
m := model.NewModel()
for _, casbinModel := range casbinModels {
m.AddDef(casbinModel.Type, casbinModel.Name, casbinModel.Rule)
}
// CasBin Xorm 适配器
// 若 不指定库名 且 不存在数据库 则会自动创建 casbin 数据库 和 casbin_rule 表
// 若 指定库名 三个参数 为 true 且 必须保证数据库已经存在 如果 不存在 casbin_rule 表 则会自动创建
//a, _ := xormadapter.NewAdapter("mysql", "root:12341234@tcp(10.10.10.100:3306)/")
a, _ := xormadapter.NewAdapter("mysql", engine.DataSourceName(), true)
e, _ := casbin.NewEnforcer(m, a)
// 启用自动保存选项。
e.EnableAutoSave(true)
err = e.LoadPolicy()
if err != nil {
logger.Log.Fatalf("[x] [casbin] policy 加载失败: %s", err)
}
// 初始化 role::root 组权限
initRootGroupPermission(e)
global.Enforcer = e
utils.MainAppExec(func() {
logger.Log.Infof("[√] [casbin] 加载成功")
})
}
func initRootGroupPermission(e *casbin.Enforcer) {
// 添加/修改 组策略
// role::root 组 继承 root 的权限
_, _ = e.AddGroupingPolicy("role::root", "user::root")
}