mirror of
https://gitee.com/shikong-sk/gofiber-study
synced 2025-02-23 23:32:15 +08:00
57 lines
1.6 KiB
Go
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")
|
|
}
|