diff --git a/object/permission.go b/object/permission.go index a7985c13..0e497c83 100644 --- a/object/permission.go +++ b/object/permission.go @@ -49,7 +49,7 @@ type Permission struct { State string `xorm:"varchar(100)" json:"state"` } -const builtInAvailableField = 5 // Casdoor built-in adapter, use V5 to filter permission, so has 5 available field +const builtInMaxFields = 6 // Casdoor built-in adapter, use V5 to filter permission, so has 6 max field func GetPermissionCount(owner, field, value string) (int64, error) { session := GetSession(owner, -1, -1, field, value, "", "") diff --git a/object/permission_enforcer.go b/object/permission_enforcer.go index 23ba1964..1631d728 100644 --- a/object/permission_enforcer.go +++ b/object/permission_enforcer.go @@ -410,15 +410,23 @@ m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act` policyDefinition := strings.Split(cfg.String("policy_definition::p"), ",") fieldsNum := len(policyDefinition) - if fieldsNum > builtInAvailableField { - return nil, fmt.Errorf("the maximum policy_definition field number cannot exceed %d, got %d", builtInAvailableField, fieldsNum) + if fieldsNum > builtInMaxFields { + return nil, fmt.Errorf("the maximum policy_definition field number cannot exceed %d, got %d", builtInMaxFields, fieldsNum) } // filled empty field with "" and V5 with "permissionId" - for i := builtInAvailableField - fieldsNum; i > 0; i-- { - policyDefinition = append(policyDefinition, "") + if fieldsNum == builtInMaxFields { + sixthField := strings.TrimSpace(policyDefinition[builtInMaxFields-1]) + if sixthField != "permissionId" { + return nil, fmt.Errorf("when adding policies with permissions, the sixth field of policy_definition must be permissionId, got %s", policyDefinition[builtInMaxFields-1]) + } + } else { + needFill := builtInMaxFields - fieldsNum + for i := 0; i < needFill-1; i++ { + policyDefinition = append(policyDefinition, "") + } + policyDefinition = append(policyDefinition, "permissionId") } - policyDefinition = append(policyDefinition, "permissionId") m, err := model.NewModelFromString(modelText) if err != nil {