@@ -39,7 +39,6 @@ async def dispatch(self, request: Request, call_next: Any) -> Response:
3939 else :
4040 method = request .method
4141 args = await self .get_request_args (request )
42- args = await self .desensitization (args )
4342
4443 # 执行请求
4544 elapsed = 0.0
@@ -116,35 +115,43 @@ async def dispatch(self, request: Request, call_next: Any) -> Response:
116115
117116 return response
118117
119- @staticmethod
120- async def get_request_args (request : Request ) -> dict [str , Any ]:
118+ async def get_request_args (self , request : Request ) -> dict [str , Any ] | None :
121119 """
122120 获取请求参数
123121
124122 :param request: FastAPI 请求对象
125123 :return:
126124 """
127125 args = {}
126+
127+ # 查询参数
128128 query_params = dict (request .query_params )
129129 if query_params :
130- args ['query_params' ] = query_params
130+ args ['query_params' ] = await self .desensitization (query_params )
131+
132+ # 路径参数
131133 path_params = request .path_params
132134 if path_params :
133- args ['path_params' ] = path_params
135+ args ['path_params' ] = await self .desensitization (path_params )
136+
134137 # Tip: .body() 必须在 .form() 之前获取
135138 # https://github.com/encode/starlette/discussions/1933
136139 content_type = request .headers .get ('Content-Type' , '' ).split (';' )
140+
141+ # 请求体
137142 body_data = await request .body ()
138143 if body_data :
139- # 注意:非 json 数据默认使用 body 作为键
144+ # 注意:非 json 数据默认使用 data 作为键
140145 if 'application/json' not in content_type :
141146 args ['data' ] = str (body_data )
142147 else :
143148 json_data = await request .json ()
144149 if isinstance (json_data , dict ):
145- args ['json' ] = json_data
150+ args ['json' ] = await self . desensitization ( json_data )
146151 else :
147152 args ['data' ] = str (body_data )
153+
154+ # 表单参数
148155 form_data = await request .form ()
149156 if len (form_data ) > 0 :
150157 for k , v in form_data .items ():
@@ -153,41 +160,33 @@ async def get_request_args(request: Request) -> dict[str, Any]:
153160 else :
154161 form_data = {k : v }
155162 if 'multipart/form-data' not in content_type :
156- args ['x-www-form-urlencoded' ] = form_data
163+ args ['x-www-form-urlencoded' ] = await self . desensitization ( form_data )
157164 else :
158- args ['form-data' ] = form_data
165+ args ['form-data' ] = await self . desensitization ( form_data )
159166
160- return args
167+ return None if not args else args
161168
162169 @staticmethod
163170 @sync_to_async
164- def desensitization (args : dict [str , Any ]) -> dict [str , Any ] | None :
171+ def desensitization (args : dict [str , Any ]) -> dict [str , Any ]:
165172 """
166173 脱敏处理
167174
168175 :param args: 需要脱敏的参数字典
169176 :return:
170177 """
171- if not args :
172- return None
173-
174- encrypt_type = settings .OPERA_LOG_ENCRYPT_TYPE
175- encrypt_key_include = settings .OPERA_LOG_ENCRYPT_KEY_INCLUDE
176- encrypt_secret_key = settings .OPERA_LOG_ENCRYPT_SECRET_KEY
177-
178- for arg_type , arg in args .items ():
179- if isinstance (arg , dict ):
180- for key , value in arg .items ():
181- if key in encrypt_key_include :
182- match encrypt_type :
183- case OperaLogCipherType .aes :
184- args [arg_type ][key ] = (AESCipher (encrypt_secret_key ).encrypt (value )).hex ()
185- case OperaLogCipherType .md5 :
186- args [arg_type ][key ] = Md5Cipher .encrypt (value )
187- case OperaLogCipherType .itsdangerous :
188- args [arg_type ][key ] = ItsDCipher (encrypt_secret_key ).encrypt (value )
189- case OperaLogCipherType .plan :
190- pass
191- case _:
192- args [arg_type ][key ] = '******'
178+ for key , value in args .items ():
179+ if key in settings .OPERA_LOG_ENCRYPT_KEY_INCLUDE :
180+ match settings .OPERA_LOG_ENCRYPT_TYPE :
181+ case OperaLogCipherType .aes :
182+ args [key ] = (AESCipher (settings .OPERA_LOG_ENCRYPT_SECRET_KEY ).encrypt (value )).hex ()
183+ case OperaLogCipherType .md5 :
184+ args [key ] = Md5Cipher .encrypt (value )
185+ case OperaLogCipherType .itsdangerous :
186+ args [key ] = ItsDCipher (settings .OPERA_LOG_ENCRYPT_SECRET_KEY ).encrypt (value )
187+ case OperaLogCipherType .plan :
188+ pass
189+ case _:
190+ args [key ] = '******'
191+
193192 return args
0 commit comments