33from typing import Any
44
55from fastapi import Request
6- from sqlalchemy import or_ , select
6+ from sqlalchemy import ColumnElement , or_ , select
77
88from backend .app .admin .model import Dept
99from backend .app .admin .model .m2m import sys_role_dept
@@ -31,11 +31,9 @@ async def __call__(self, request: Request):
3131 request .state .permission = self .value
3232
3333
34- def filter_data_permission (request : Request , model : Any ) -> Any :
34+ def filter_data_scope (request : Request , model : Any ) -> ColumnElement [ bool ] :
3535 """
36- 过滤用户数据范围
37-
38- 使用场景:对于非后台管理数据,需要在前端界面向用户进行展示的数据
36+ 过滤用户数据范围(当前设计存在较大弊端,仅供参考)
3937
4038 :param request: 接口请求对象
4139 :param model: 需要进行数据过滤的 sqlalchemy 模型
@@ -54,42 +52,33 @@ def filter_data_permission(request: Request, model: Any) -> Any:
5452 if not user_roles :
5553 return or_ (getattr (model , 'created_by' ) == user_id if hasattr (model , 'created_by' ) else 1 == 0 )
5654
55+ data_scope = min (role .data_scope for role in user_roles if role .status == 1 )
5756 user_dept_id = user .dept_id
5857
59- conditions = []
60-
61- # 获取用户的所有角色
62- for role in user .roles :
63- if not role .status : # 角色已停用
64- continue
65-
66- # 全部数据权限
67- if role .data_scope == 0 :
68- return or_ (1 == 1 )
69-
70- # 自定义数据权限
71- elif role .data_scope == 1 :
72- dept_ids = select (sys_role_dept .c .dept_id ).where (sys_role_dept .c .role_id == role .id )
73- conditions .append (getattr (model , 'dept_id' ).in_ (dept_ids ) if hasattr (model , 'dept_id' ) else 1 == 0 )
58+ # 全部数据权限
59+ if data_scope == 0 :
60+ return or_ (1 == 1 )
7461
75- # 部门及以下数据权限
76- elif role .data_scope == 2 :
77- child_dept_ids = select (Dept .id ).where (or_ (Dept .id == user_dept_id , Dept .parent_id == user_dept_id ))
78- conditions .append (getattr (model , 'dept_id' ).in_ (child_dept_ids ) if hasattr (model , 'dept_id' ) else 1 == 0 )
62+ # 自定义数据权限
63+ elif data_scope == 1 :
64+ dept_ids = select (sys_role_dept .c .dept_id ).where (
65+ sys_role_dept .c .role_id .in_ (role .id for role in user_roles if role .status == 1 )
66+ )
67+ return or_ (getattr (model , 'dept_id' ).in_ (dept_ids ) if hasattr (model , 'dept_id' ) else 1 == 0 )
7968
80- # 本部门数据权限
81- elif role .data_scope == 3 :
82- conditions .append (getattr (model , 'dept_id' ) == user_dept_id if hasattr (model , 'dept_id' ) else 1 == 0 )
69+ # 部门及以下数据权限
70+ elif data_scope == 2 :
71+ child_dept_ids = select (Dept .id ).where (or_ (Dept .id == user_dept_id , Dept .parent_id == user_dept_id ))
72+ return or_ (getattr (model , 'dept_id' ).in_ (child_dept_ids ) if hasattr (model , 'dept_id' ) else 1 == 0 )
8373
84- # 仅本人数据权限
85- elif role . data_scope == 4 :
86- conditions . append (getattr (model , 'created_by ' ) == user_id if hasattr (model , 'created_by ' ) else 1 == 0 )
74+ # 本部门数据权限
75+ elif data_scope == 3 :
76+ return or_ (getattr (model , 'dept_id ' ) == user_dept_id if hasattr (model , 'dept_id ' ) else 1 == 0 )
8777
88- # 默认
89- else :
90- conditions . append ( 1 == 0 )
78+ # 仅本人数据权限
79+ elif data_scope == 4 :
80+ return or_ ( getattr ( model , 'created_by' ) == user_id if hasattr ( model , 'created_by' ) else 1 == 0 )
9181
92- if not conditions :
82+ # 默认
83+ else :
9384 return or_ (1 == 0 )
94-
95- return or_ (* conditions )
0 commit comments