diff --git a/object/enforcer.go b/object/enforcer.go index c963f57c..02a6a43b 100644 --- a/object/enforcer.go +++ b/object/enforcer.go @@ -18,7 +18,6 @@ import ( "fmt" "github.com/casbin/casbin/v2" - "github.com/casbin/casbin/v2/config" "github.com/casdoor/casdoor/util" xormadapter "github.com/casdoor/xorm-adapter/v3" "github.com/xorm-io/core" @@ -254,16 +253,10 @@ func (enforcer *Enforcer) LoadModelCfg() error { return fmt.Errorf("the model: %s for enforcer: %s is not found", enforcer.Model, enforcer.GetId()) } - cfg, err := config.NewConfigFromText(model.ModelText) + enforcer.ModelCfg, err = getModelCfg(model) if err != nil { return err } - enforcer.ModelCfg = make(map[string]string) - enforcer.ModelCfg["p"] = cfg.String("policy_definition::p") - if cfg.String("role_definition::g") != "" { - enforcer.ModelCfg["g"] = cfg.String("role_definition::g") - } - return nil } diff --git a/object/model.go b/object/model.go index a1979d96..19b73c73 100644 --- a/object/model.go +++ b/object/model.go @@ -17,6 +17,7 @@ package object import ( "fmt" + "github.com/casbin/casbin/v2/config" "github.com/casbin/casbin/v2/model" "github.com/casdoor/casdoor/util" "github.com/xorm-io/core" @@ -188,3 +189,17 @@ func (m *Model) initModel() error { return nil } + +func getModelCfg(m *Model) (map[string]string, error) { + cfg, err := config.NewConfigFromText(m.ModelText) + if err != nil { + return nil, err + } + + modelCfg := make(map[string]string) + modelCfg["p"] = cfg.String("policy_definition::p") + if cfg.String("role_definition::g") != "" { + modelCfg["g"] = cfg.String("role_definition::g") + } + return modelCfg, nil +} diff --git a/object/permission.go b/object/permission.go index 4532fdc0..0d9eb471 100644 --- a/object/permission.go +++ b/object/permission.go @@ -150,6 +150,21 @@ func UpdatePermission(id string, permission *Permission) (bool, error) { return false, nil } + if permission.ResourceType == "Application" { + model, err := GetModel(util.GetId(owner, permission.Model)) + if err != nil { + return false, err + } + modelCfg, err := getModelCfg(model) + if err != nil { + return false, err + } + + if len(strings.Split(modelCfg["p"], ",")) != 3 { + return false, fmt.Errorf("the model: %s for permission: %s is not valid, application type resources need 3 size [policy_defination] model", permission.Model, permission.GetId()) + } + } + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(permission) if err != nil { return false, err