Skip to content

Commit 39c3339

Browse files
authored
Optimize role-related data processing performance (#635)
1 parent 9f52629 commit 39c3339

File tree

3 files changed

+30
-25
lines changed

3 files changed

+30
-25
lines changed

backend/app/admin/service/menu_service.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,16 @@ async def get_sidebar(*, request: Request) -> list[dict[str, Any] | None]:
5757
roles = request.user.roles
5858
menu_tree = []
5959
if roles:
60-
all_menus = []
60+
unique_menus = {}
6161
for role in roles:
62-
all_menus.extend(role.menus)
63-
all_ids = [menu.id for menu in all_menus]
64-
valid_menu_ids = [menu.id for menu in all_menus if menu.parent_id is None or menu.parent_id in all_ids]
62+
for menu in role.menus:
63+
unique_menus[menu.id] = menu
64+
all_ids = set(unique_menus.keys())
65+
valid_menu_ids = [
66+
menu_id
67+
for menu_id, menu in unique_menus.items()
68+
if menu.parent_id is None or menu.parent_id in all_ids
69+
]
6570
menu_data = await menu_dao.get_sidebar(db, request.user.is_superuser, valid_menu_ids)
6671
menu_tree = get_vben5_tree_data(menu_data)
6772
return menu_tree

backend/common/security/permission.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3-
from typing import TYPE_CHECKING
43

54
from fastapi import Request
65
from sqlalchemy import ColumnElement, and_, or_
@@ -13,9 +12,6 @@
1312
from backend.core.conf import settings
1413
from backend.utils.import_parse import dynamic_import_data_model
1514

16-
if TYPE_CHECKING:
17-
from backend.app.admin.model import DataRule
18-
1915

2016
class RequestPermission:
2117
"""
@@ -60,35 +56,34 @@ async def filter_data_permission(db: AsyncSession, request: Request) -> ColumnEl
6056
:param request: FastAPI 请求对象
6157
:return:
6258
"""
63-
# 获取用户角色和数据范围
64-
data_scopes = []
59+
# 获取数据范围
60+
unique_data_scopes = {}
6561
for role in request.user.roles:
6662
for scope in role.scopes:
6763
if scope.status:
68-
data_scopes.append(scope)
64+
unique_data_scopes[scope.id] = scope
65+
66+
# 转换为列表
67+
data_scopes = list(unique_data_scopes.values())
6968

7069
# 超级管理员和无规则用户不做过滤
7170
if request.user.is_superuser or not data_scopes:
7271
return or_(1 == 1)
7372

7473
# 获取数据范围规则
75-
data_rule_list: list[DataRule] = []
74+
unique_data_rules = {}
7675
for data_scope in data_scopes:
7776
data_scope_with_relation = await data_scope_dao.get_with_relation(db, data_scope.id)
78-
data_rule_list.extend(data_scope_with_relation.rules)
77+
for rule in data_scope_with_relation.rules:
78+
unique_data_rules[rule.id] = rule
7979

80-
# 去重
81-
seen_data_rule_ids = set()
82-
new_data_rule_list = []
83-
for rule in data_rule_list:
84-
if rule.id not in seen_data_rule_ids:
85-
seen_data_rule_ids.add(rule.id)
86-
new_data_rule_list.append(rule)
80+
# 转换为列表
81+
data_rule_list = list(unique_data_rules.values())
8782

8883
where_and_list = []
8984
where_or_list = []
9085

91-
for data_rule in new_data_rule_list:
86+
for data_rule in data_rule_list:
9287
# 验证规则模型
9388
rule_model = data_rule.model
9489
if rule_model not in settings.DATA_PERMISSION_MODELS:

backend/common/security/rbac.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,17 @@ async def rbac_verify(request: Request, _token: str = DependsJwtAuth) -> None:
6060
if path_auth_perm in settings.RBAC_ROLE_MENU_EXCLUDE:
6161
return
6262

63-
# 已分配菜单权限校验
64-
allow_perms = []
63+
# 菜单去重
64+
unique_menus = {}
6565
for role in user_roles:
6666
for menu in role.menus:
67-
if menu.perms and menu.status == StatusType.enable:
68-
allow_perms.extend(menu.perms.split(','))
67+
unique_menus[menu.id] = menu
68+
69+
# 已分配菜单权限校验
70+
allow_perms = []
71+
for menu in list(unique_menus.values()):
72+
if menu.perms and menu.status == StatusType.enable:
73+
allow_perms.extend(menu.perms.split(','))
6974
if path_auth_perm not in allow_perms:
7075
raise AuthorizationError
7176
else:

0 commit comments

Comments
 (0)