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{} res := [][]bool{}
listPermissionIdMap := map[string][]string{}
for _, permission := range permissions { 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 { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@ -144,6 +156,7 @@ func (c *ApiController) BatchEnforce() {
res = append(res, enforceResult) res = append(res, enforceResult)
} }
c.ResponseOk(res) c.ResponseOk(res)
} }

View File

@ -26,7 +26,7 @@ import (
xormadapter "github.com/casdoor/xorm-adapter/v3" xormadapter "github.com/casdoor/xorm-adapter/v3"
) )
func getEnforcer(permission *Permission) *casbin.Enforcer { func getEnforcer(permission *Permission, permissionIDs ...string) *casbin.Enforcer {
tableName := "permission_rule" tableName := "permission_rule"
if len(permission.Adapter) != 0 { if len(permission.Adapter) != 0 {
adapterObj, err := getCasbinAdapter(permission.Owner, permission.Adapter) adapterObj, err := getCasbinAdapter(permission.Owner, permission.Adapter)
@ -77,8 +77,13 @@ func getEnforcer(permission *Permission) *casbin.Enforcer {
enforcer.SetAdapter(adapter) enforcer.SetAdapter(adapter)
policyFilterV5 := []string{permission.GetId()}
if len(permissionIDs) != 0 {
policyFilterV5 = permissionIDs
}
policyFilter := xormadapter.Filter{ policyFilter := xormadapter.Filter{
V5: []string{permission.GetId()}, V5: policyFilterV5,
} }
if !HasRoleDefinition(m) { if !HasRoleDefinition(m) {
@ -251,7 +256,7 @@ func Enforce(permissionId string, request *CasbinRequest) (bool, error) {
return enforcer.Enforce(*request...) 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) permission, err := GetPermission(permissionId)
if err != nil { if err != nil {
res := []bool{} res := []bool{}
@ -262,7 +267,7 @@ func BatchEnforce(permissionId string, requests *[]CasbinRequest) ([]bool, error
return res, err return res, err
} }
enforcer := getEnforcer(permission) enforcer := getEnforcer(permission, permissionIds...)
return enforcer.BatchEnforce(*requests) return enforcer.BatchEnforce(*requests)
} }