mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-03 12:30:19 +08:00
fix: refactor and optimize Enforce() API (#2009)
This commit is contained in:
@ -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 {
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user