2022-05-18 17:57:03 +08:00
|
|
|
|
package common
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
|
|
"github.com/casbin/casbin/v2"
|
2024-04-04 16:27:34 +08:00
|
|
|
|
"github.com/casbin/casbin/v2/model"
|
2022-05-18 17:57:03 +08:00
|
|
|
|
gormadapter "github.com/casbin/gorm-adapter/v3"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 全局CasbinEnforcer
|
|
|
|
|
var CasbinEnforcer *casbin.Enforcer
|
|
|
|
|
|
|
|
|
|
// 初始化casbin策略管理器
|
|
|
|
|
func InitCasbinEnforcer() {
|
|
|
|
|
e, err := mysqlCasbin()
|
|
|
|
|
if err != nil {
|
|
|
|
|
Log.Panicf("初始化Casbin失败:%v", err)
|
|
|
|
|
panic(fmt.Sprintf("初始化Casbin失败:%v", err))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CasbinEnforcer = e
|
|
|
|
|
Log.Info("初始化Casbin完成!")
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-04 16:27:34 +08:00
|
|
|
|
var casbinModel = `
|
|
|
|
|
[request_definition]
|
|
|
|
|
r = sub, obj, act
|
|
|
|
|
|
|
|
|
|
[policy_definition]
|
|
|
|
|
p = sub, obj, act
|
|
|
|
|
|
|
|
|
|
[role_definition]
|
|
|
|
|
g = _, _
|
|
|
|
|
|
|
|
|
|
[policy_effect]
|
|
|
|
|
e = some(where (p.eft == allow))
|
|
|
|
|
|
|
|
|
|
[matchers]
|
|
|
|
|
m = r.sub == p.sub && (keyMatch2(r.obj, p.obj) || keyMatch(r.obj, p.obj)) && (r.act == p.act || p.act == "*")
|
|
|
|
|
`
|
|
|
|
|
|
2022-05-18 17:57:03 +08:00
|
|
|
|
func mysqlCasbin() (*casbin.Enforcer, error) {
|
|
|
|
|
a, err := gormadapter.NewAdapterByDB(DB)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2024-04-04 16:27:34 +08:00
|
|
|
|
m, err := model.NewModelFromString(casbinModel)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
e, err := casbin.NewEnforcer(m, a)
|
2022-05-18 17:57:03 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = e.LoadPolicy()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return e, nil
|
|
|
|
|
}
|