66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
|
|
package casbin
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"github.com/casbin/casbin/v2"
|
||
|
|
"github.com/casbin/casbin/v2/model"
|
||
|
|
gormadapter "github.com/casbin/gorm-adapter/v3"
|
||
|
|
"gorm.io/driver/mysql"
|
||
|
|
"gorm.io/gorm"
|
||
|
|
)
|
||
|
|
|
||
|
|
const modelText = `
|
||
|
|
[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 = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && (r.act == p.act || p.act == "*")
|
||
|
|
`
|
||
|
|
|
||
|
|
func NewEnforcer(dsn string) (*casbin.Enforcer, error) {
|
||
|
|
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
adapter, err := gormadapter.NewAdapterByDB(db)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
m, err := model.NewModelFromString(modelText)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
enforcer, err := casbin.NewEnforcer(m, adapter)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := enforcer.LoadPolicy(); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
return enforcer, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func CheckPermission(enforcer *casbin.Enforcer, roleKey, path, method string) bool {
|
||
|
|
method = strings.ToUpper(method)
|
||
|
|
ok, err := enforcer.Enforce(roleKey, path, method)
|
||
|
|
if err != nil {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
return ok
|
||
|
|
}
|