3030from backend .components .domains import ESB_PREFIX
3131from backend .components .exception import DataAPIException
3232from backend .configuration .models .system import SystemSettings
33- from backend .exceptions import ApiError , ApiRequestError , ApiResultError , AppBaseException
33+ from backend .exceptions import ApiError , ApiRequestError , ApiResultError , AppBaseException , ValidationError
3434from backend .utils .local import local
3535
3636logger = logging .getLogger ("root" )
@@ -413,6 +413,39 @@ def _set_cache(self, cache_key, data):
413413 """
414414 cache .set (cache_key , data , self .cache_time )
415415
416+ def _get_cached_admin_username (self ):
417+ """
418+ 获取缓存的租户管理员用户名
419+ """
420+ if not env .ENABLE_MULTI_TENANT_MODE :
421+ return env .DEFAULT_USERNAME
422+
423+ login_name = "bk_admin"
424+ cache_key = f"dbm:tenant_admin_username:{ env .BK_TENANT_ID } :{ login_name } "
425+ bk_username = cache .get (cache_key , "" )
426+ if not bk_username :
427+ try :
428+ from backend .components .usermanage .client import UserManagerApi
429+
430+ params = {"lookup_field" : "login_name" , "lookups" : login_name }
431+ # 接口返回不规范(无result/code字段),使用raw=True绕过DataAPI的统一校验
432+ res = UserManagerApi .batch_lookup_virtual_user (params , use_admin = False , use_param_user = True , raw = True )
433+ data = res .get ("data" )
434+ if isinstance (data , list ) and data :
435+ bk_username = data [0 ].get ("bk_username" ) or data [0 ].get ("username" )
436+ elif isinstance (data , dict ) and data :
437+ bk_username = data .get ("bk_username" ) or data .get ("username" )
438+ if bk_username :
439+ cache .set (cache_key , bk_username , 60 * 60 * 24 )
440+ else :
441+ raise ValidationError (_ ("获取租户管理员账号失败: 未能从响应中获取用户名" ))
442+ except Exception as e :
443+ error_msg = _ ("获取租户管理员账号失败: {error}" ).format (error = str (e ))
444+ logger .error (error_msg )
445+ raise ValidationError (error_msg )
446+
447+ return bk_username
448+
416449 def _set_session_headers (self , session , local_request , headers : Dict , params : Dict , use_admin : bool = False ):
417450 """
418451 设置session的headers
@@ -430,17 +463,23 @@ def _set_session_headers(self, session, local_request, headers: Dict, params: Di
430463 # 增加鉴权信息
431464 if not isinstance (params , dict ):
432465 return
466+
467+ bk_token = session .headers .get ("bk_token" , "" )
468+ if not bk_token and local_request and hasattr (local_request , "COOKIES" ):
469+ bk_token = local_request .COOKIES .get ("bk_token" , "" )
470+
433471 bkapi_auth_headers = {
434472 "bk_app_code" : params .pop ("bk_app_code" , env .APP_CODE ),
435473 "bk_app_secret" : params .pop ("bk_app_secret" , env .SECRET_KEY ),
436474 "bk_username" : params .get ("bk_username" , "Anonymous" ),
475+ "bk_token" : bk_token ,
437476 }
438477 if use_admin :
439478 # 使用管理员/平台身份调用接口
440- bkapi_auth_headers ["bk_username" ] = env . DEFAULT_USERNAME
479+ bkapi_auth_headers ["bk_username" ] = self . _get_cached_admin_username ()
441480 elif self .is_backend_request (local_request ) and not self .use_param_user :
442481 # 后台调用(且不明确用户),使用管理员/平台身份调用接口
443- bkapi_auth_headers ["bk_username" ] = env . DEFAULT_USERNAME
482+ bkapi_auth_headers ["bk_username" ] = self . _get_cached_admin_username ()
444483 elif local_request and local_request .COOKIES :
445484 # 根据不同环境,传递认证信息
446485 bkapi_auth_headers ["bk_username" ] = local_request .user .username
0 commit comments