diff --git a/controllers/enforcer.go b/controllers/enforcer.go index b9cfd3cc..40e985a7 100644 --- a/controllers/enforcer.go +++ b/controllers/enforcer.go @@ -135,8 +135,20 @@ func (c *ApiController) BatchEnforce() { } res := [][]bool{} + listPermissionIdMap := map[string][]string{} + for _, permission := range permissions { - enforceResult, err := object.BatchEnforce(permission.GetId(), &requests) + key := permission.Model + permission.Adapter + permissionIds, ok := listPermissionIdMap[key] + if !ok { + listPermissionIdMap[key] = []string{permission.GetId()} + } else { + listPermissionIdMap[key] = append(permissionIds, permission.GetId()) + } + } + + for _, permissionIds := range listPermissionIdMap { + enforceResult, err := object.BatchEnforce(permissionIds[0], &requests, permissionIds...) if err != nil { c.ResponseError(err.Error()) return @@ -144,6 +156,7 @@ func (c *ApiController) BatchEnforce() { res = append(res, enforceResult) } + c.ResponseOk(res) } diff --git a/object/permission_enforcer.go b/object/permission_enforcer.go index 2ba6fceb..ca93ecc2 100644 --- a/object/permission_enforcer.go +++ b/object/permission_enforcer.go @@ -26,7 +26,7 @@ import ( xormadapter "github.com/casdoor/xorm-adapter/v3" ) -func getEnforcer(permission *Permission) *casbin.Enforcer { +func getEnforcer(permission *Permission, permissionIDs ...string) *casbin.Enforcer { tableName := "permission_rule" if len(permission.Adapter) != 0 { adapterObj, err := getCasbinAdapter(permission.Owner, permission.Adapter) @@ -77,8 +77,13 @@ func getEnforcer(permission *Permission) *casbin.Enforcer { enforcer.SetAdapter(adapter) + policyFilterV5 := []string{permission.GetId()} + if len(permissionIDs) != 0 { + policyFilterV5 = permissionIDs + } + policyFilter := xormadapter.Filter{ - V5: []string{permission.GetId()}, + V5: policyFilterV5, } if !HasRoleDefinition(m) { @@ -251,7 +256,7 @@ func Enforce(permissionId string, request *CasbinRequest) (bool, error) { return enforcer.Enforce(*request...) } -func BatchEnforce(permissionId string, requests *[]CasbinRequest) ([]bool, error) { +func BatchEnforce(permissionId string, requests *[]CasbinRequest, permissionIds ...string) ([]bool, error) { permission, err := GetPermission(permissionId) if err != nil { res := []bool{} @@ -262,7 +267,7 @@ func BatchEnforce(permissionId string, requests *[]CasbinRequest) ([]bool, error return res, err } - enforcer := getEnforcer(permission) + enforcer := getEnforcer(permission, permissionIds...) return enforcer.BatchEnforce(*requests) }