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") }