Skip to content

Commit 4eb76ad

Browse files
authored
Update the opera log desensitization method (#756)
* Update the opera log desensitization method * Update request args function return
1 parent 1f86871 commit 4eb76ad

File tree

1 file changed

+32
-33
lines changed

1 file changed

+32
-33
lines changed

backend/middleware/opera_log_middleware.py

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)