Skip to content

Commit 895e132

Browse files
committed
fix: 修复ESB请求获取不到用户问题 (closed #385)
1 parent 8dc0c46 commit 895e132

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

apps/middlewares.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from apps.exceptions import AppBaseException
3737

3838
from apps.utils.local import activate_request
39+
from apigw_manager.apigw.authentication import ApiGatewayJWTUserMiddleware
3940

4041

4142
class AccessorSignal(Signal):
@@ -163,7 +164,10 @@ def process_exception(self, request, exception):
163164
# 处理 Data APP 自定义异常
164165
if isinstance(exception, AppBaseException):
165166
_msg = _("【APP 自定义异常】{message}, code={code}, args={args}").format(
166-
message=exception.message, code=exception.code, args=exception.args, data=exception.data,
167+
message=exception.message,
168+
code=exception.code,
169+
args=exception.args,
170+
data=exception.data,
167171
)
168172
logger.exception(_msg)
169173
return JsonResponse(
@@ -174,7 +178,12 @@ def process_exception(self, request, exception):
174178
if isinstance(exception, BlueException):
175179
logger.exception(
176180
("""捕获主动抛出异常, 具体异常堆栈->[%s] status_code->[%s] & """ """client_message->[%s] & args->[%s] """)
177-
% (traceback.format_exc(), exception.error_code, exception.message, exception.args,)
181+
% (
182+
traceback.format_exc(),
183+
exception.error_code,
184+
exception.message,
185+
exception.args,
186+
)
178187
)
179188

180189
response = JsonResponse(
@@ -204,3 +213,21 @@ def process_exception(self, request, exception):
204213
response.status_code = 500
205214

206215
return response
216+
217+
218+
class ApiGatewayJWTUserInjectAppMiddleware(ApiGatewayJWTUserMiddleware):
219+
def __call__(self, request):
220+
logger.info(f"requestapigw: {request.user.username}, {request.user}")
221+
# jwt_app 依赖于 ApiGatewayJWTAppMiddleware 注入
222+
jwt_app = getattr(request, "app", None)
223+
if not jwt_app:
224+
return super().__call__(request)
225+
226+
# 和开发框架保持一致行为,如果通过应用认证并且开启 ESB 白名单,此时认为用户认证也通过
227+
use_esb_white_list = getattr(settings, "USE_ESB_WHITE_LIST", True)
228+
if use_esb_white_list and jwt_app.verified:
229+
# 如果 user 信息不存在,默认填充 bk_app_code 作为用户名
230+
request.jwt.payload["user"] = request.jwt.payload.get("user") or {"bk_username": jwt_app.bk_app_code}
231+
request.jwt.payload["user"]["verified"] = True
232+
233+
return super().__call__(request)

config/default.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,31 @@
5353

5454
# 自定义中间件
5555
MIDDLEWARE += (
56+
# request instance provider
57+
"blueapps.middleware.request_provider.RequestProvider",
58+
"django.contrib.sessions.middleware.SessionMiddleware",
59+
"django.middleware.common.CommonMiddleware",
60+
"django.middleware.csrf.CsrfViewMiddleware",
61+
"django.contrib.auth.middleware.AuthenticationMiddleware",
62+
"django.contrib.messages.middleware.MessageMiddleware",
63+
# 跨域检测中间件, 默认关闭
64+
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
65+
"django.middleware.security.SecurityMiddleware",
66+
# 蓝鲸静态资源服务
67+
"whitenoise.middleware.WhiteNoiseMiddleware",
68+
# Auth middleware
69+
"blueapps.account.middlewares.RioLoginRequiredMiddleware",
70+
"blueapps.account.middlewares.WeixinLoginRequiredMiddleware",
71+
"blueapps.account.middlewares.LoginRequiredMiddleware",
5672
# "blueapps.account.middlewares.BkJwtLoginRequiredMiddleware",
57-
"apps.middlewares.CommonMid",
58-
"apps.middlewares.UserLocalMiddleware",
5973
"apigw_manager.apigw.authentication.ApiGatewayJWTGenericMiddleware", # JWT 认证
6074
"apigw_manager.apigw.authentication.ApiGatewayJWTAppMiddleware", # JWT 透传的应用信息
61-
"apigw_manager.apigw.authentication.ApiGatewayJWTUserMiddleware", # JWT 透传的用户信息
75+
"apps.middlewares.ApiGatewayJWTUserInjectAppMiddleware", # JWT 透传的用户信息
76+
# exception middleware
77+
"blueapps.core.exceptions.middleware.AppExceptionMiddleware",
78+
"django.middleware.locale.LocaleMiddleware",
79+
"apps.middlewares.CommonMid",
80+
"apps.middlewares.UserLocalMiddleware",
6281
)
6382

6483
# 添加django_prometheus中间件

0 commit comments

Comments
 (0)