11from fastapi import Request
22from sqlalchemy import ColumnElement , and_ , or_
3- from sqlalchemy .ext .asyncio import AsyncSession
43
5- from backend .app .admin .crud .crud_data_scope import data_scope_dao
64from backend .app .admin .schema .user import GetUserInfoWithRelationDetail
75from backend .common .context import ctx
86from backend .common .enums import RoleDataRuleExpressionType , RoleDataRuleOperatorType
@@ -43,14 +41,13 @@ async def __call__(self, request: Request) -> None:
4341 ctx .permission = self .value
4442
4543
46- async def filter_data_permission (db : AsyncSession , request_user : GetUserInfoWithRelationDetail ) -> ColumnElement [bool ]: # noqa: C901
44+ def filter_data_permission (request_user : GetUserInfoWithRelationDetail ) -> ColumnElement [bool ]: # noqa: C901
4745 """
4846 过滤数据权限,控制用户可见数据范围
4947
5048 使用场景:
5149 - 控制用户能看到哪些数据
5250
53- :param db: 数据库会话
5451 :param request_user: 请求用户
5552 :return:
5653 """
@@ -62,31 +59,21 @@ async def filter_data_permission(db: AsyncSession, request_user: GetUserInfoWith
6259 if not role .is_filter_scopes :
6360 return or_ (1 == 1 )
6461
65- # 获取数据范围
66- data_scope_ids = set ()
62+ # 获取数据规则
63+ data_rules = set ()
6764 for role in request_user .roles :
6865 for scope in role .scopes :
6966 if scope .status :
70- data_scope_ids . add (scope .id )
67+ data_rules . update (scope .rules )
7168
7269 # 无规则用户不做过滤
73- if not list (data_scope_ids ):
70+ if not list (data_rules ):
7471 return or_ (1 == 1 )
7572
76- # 获取数据范围规则
77- unique_data_rules = {}
78- for data_scope_id in list (data_scope_ids ):
79- data_scope_with_relation = await data_scope_dao .get_with_relation (db , data_scope_id )
80- for rule in data_scope_with_relation .rules :
81- unique_data_rules [rule .id ] = rule
82-
83- # 转换为列表
84- data_rule_list = list (unique_data_rules .values ())
85-
8673 where_and_list = []
8774 where_or_list = []
8875
89- for data_rule in data_rule_list :
76+ for data_rule in list ( data_rules ) :
9077 # 验证规则模型
9178 rule_model = data_rule .model
9279 if rule_model not in settings .DATA_PERMISSION_MODELS :
0 commit comments