feat: optimize batch-enforce (#1997)

This commit is contained in:
June 2023-06-22 13:40:09 +07:00 committed by GitHub
parent cadb533595
commit 2c2ddfbb92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 5 deletions

View File

@ -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)
}

View File

@ -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)
}