fix: refactor and optimize Enforce() API (#2009)

This commit is contained in:
June
2023-06-22 16:45:24 +07:00
committed by GitHub
parent b817a55f9f
commit 463b3ad976
3 changed files with 29 additions and 15 deletions

View File

@ -76,8 +76,10 @@ func (c *ApiController) Enforce() {
} }
res := []bool{} res := []bool{}
for _, permission := range permissions {
enforceResult, err := object.Enforce(permission.GetId(), &request) listPermissionIdMap := object.GroupPermissionsByModelAdapter(permissions)
for _, permissionIds := range listPermissionIdMap {
enforceResult, err := object.Enforce(permissionIds[0], &request, permissionIds...)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@ -85,6 +87,7 @@ func (c *ApiController) Enforce() {
res = append(res, enforceResult) res = append(res, enforceResult)
} }
c.ResponseOk(res) c.ResponseOk(res)
} }
@ -135,18 +138,8 @@ func (c *ApiController) BatchEnforce() {
} }
res := [][]bool{} res := [][]bool{}
listPermissionIdMap := map[string][]string{}
for _, permission := range permissions {
key := permission.Model + permission.Adapter
permissionIds, ok := listPermissionIdMap[key]
if !ok {
listPermissionIdMap[key] = []string{permission.GetId()}
} else {
listPermissionIdMap[key] = append(permissionIds, permission.GetId())
}
}
listPermissionIdMap := object.GroupPermissionsByModelAdapter(permissions)
for _, permissionIds := range listPermissionIdMap { for _, permissionIds := range listPermissionIdMap {
enforceResult, err := object.BatchEnforce(permissionIds[0], &requests, permissionIds...) enforceResult, err := object.BatchEnforce(permissionIds[0], &requests, permissionIds...)
if err != nil { if err != nil {

View File

@ -370,3 +370,24 @@ func GetMaskedPermissions(permissions []*Permission) []*Permission {
return permissions return permissions
} }
// GroupPermissionsByModelAdapter group permissions by model and adapter.
// Every model and adapter will be a key, and the value is a list of permission ids.
// With each list of permission ids have the same key, we just need to init the
// enforcer and do the enforce/batch-enforce once (with list of permission ids
// as the policyFilter when the enforcer load policy).
func GroupPermissionsByModelAdapter(permissions []*Permission) map[string][]string {
m := make(map[string][]string)
for _, permission := range permissions {
key := permission.Model + permission.Adapter
permissionIds, ok := m[key]
if !ok {
m[key] = []string{permission.GetId()}
} else {
m[key] = append(permissionIds, permission.GetId())
}
}
return m
}

View File

@ -246,13 +246,13 @@ func removePolicies(permission *Permission) {
type CasbinRequest = []interface{} type CasbinRequest = []interface{}
func Enforce(permissionId string, request *CasbinRequest) (bool, error) { func Enforce(permissionId string, request *CasbinRequest, permissionIds ...string) (bool, error) {
permission, err := GetPermission(permissionId) permission, err := GetPermission(permissionId)
if err != nil { if err != nil {
return false, err return false, err
} }
enforcer := getEnforcer(permission) enforcer := getEnforcer(permission, permissionIds...)
return enforcer.Enforce(*request...) return enforcer.Enforce(*request...)
} }