diff --git a/src/bk-login/bklogin/authentication/api_views.py b/src/bk-login/bklogin/authentication/api_views.py index 39647dca6..f1d291dd4 100644 --- a/src/bk-login/bklogin/authentication/api_views.py +++ b/src/bk-login/bklogin/authentication/api_views.py @@ -9,12 +9,11 @@ specific language governing permissions and limitations under the License. """ from django.conf import settings -from django.utils.translation import gettext_lazy as _ from django.views.generic import View -from bklogin.bkuser.models import TenantUser from bklogin.common.error_codes import error_codes from bklogin.common.response import APISuccessResponse +from bklogin.component import bk_user as bk_user_api from .manager import BkTokenManager @@ -38,17 +37,15 @@ def get(self, request, *args, **kwargs): if not ok: raise error_codes.VALIDATION_ERROR.f(msg) - user = TenantUser.objects.filter(id=username).first() - if not user: - raise error_codes.OBJECT_NOT_FOUND.f(_("用户({})查询不到").format(username)) + user = bk_user_api.get_tenant_user(username) return APISuccessResponse( { - "bk_username": username, - "tenant_id": user.tenant_id, - "full_name": user.data_source_user.full_name, - "source_username": user.data_source_user.username, - "language": user.language, - "time_zone": user.time_zone, + "bk_username": user["id"], + "tenant_id": user["tenant_id"], + "full_name": user["full_name"], + "source_username": user["username"], + "language": user["language"], + "time_zone": user["time_zone"], } ) diff --git a/src/bk-login/bklogin/component/bk_user.py b/src/bk-login/bklogin/component/bk_user.py index 7a11caaff..db09598ce 100644 --- a/src/bk-login/bklogin/component/bk_user.py +++ b/src/bk-login/bklogin/component/bk_user.py @@ -64,7 +64,7 @@ def list_tenant(tenant_ids: List[str] | None = None) -> List[Dict]: def get_tenant(tenant_id: str) -> Dict: """通过租户 ID 获取租户信息""" - return _call_bk_user_api(http_get, f"/api/v1/login/tenants/{tenant_id}") + return _call_bk_user_api(http_get, f"/api/v1/login/tenants/{tenant_id}/") def list_idp(tenant_id: str) -> List[Dict]: @@ -84,3 +84,8 @@ def list_matched_tencent_user(tenant_id: str, idp_id: str, idp_users: List[Dict[ f"/api/v1/login/tenants/{tenant_id}/idps/{idp_id}/matched-tenant-users/", json={"idp_users": idp_users}, ) + + +def get_tenant_user(tenant_user_id: str) -> Dict[str, Any]: + """通过租户用户ID获取租户用户信息""" + return _call_bk_user_api(http_get, f"/api/v1/login/tenant-users/{tenant_user_id}/") diff --git a/src/bk-user/bkuser/apis/login/serializers.py b/src/bk-user/bkuser/apis/login/serializers.py index ad97dab27..9c7abb3ba 100644 --- a/src/bk-user/bkuser/apis/login/serializers.py +++ b/src/bk-user/bkuser/apis/login/serializers.py @@ -87,3 +87,13 @@ class TenantUserMatchOutputSLZ(serializers.Serializer): id = serializers.CharField(help_text="租户用户 ID") username = serializers.CharField(help_text="租户用户名") full_name = serializers.CharField(help_text="租户用户姓名") + + +class TenantUserRetrieveOutputSLZ(serializers.Serializer): + id = serializers.CharField(help_text="用户 ID") + username = serializers.ReadOnlyField(help_text="用户名", source="data_source_user.username") + full_name = serializers.ReadOnlyField(help_text="用户姓名", source="data_source_user.full_name") + language = serializers.CharField(help_text="语言") + time_zone = serializers.CharField(help_text="时区") + + tenant_id = serializers.CharField(help_text="用户所在租户 ID") diff --git a/src/bk-user/bkuser/apis/login/urls.py b/src/bk-user/bkuser/apis/login/urls.py index f654749a8..90a8785e4 100644 --- a/src/bk-user/bkuser/apis/login/urls.py +++ b/src/bk-user/bkuser/apis/login/urls.py @@ -35,4 +35,5 @@ views.TenantUserMatchApi.as_view(), name="login.matched_tenant_user.match", ), + path("tenant-users//", views.TenantUserRetrieveApi.as_view(), name="login.tenant_user.retrieve"), ] diff --git a/src/bk-user/bkuser/apis/login/views.py b/src/bk-user/bkuser/apis/login/views.py index 555b0f604..bdd1ac1d7 100644 --- a/src/bk-user/bkuser/apis/login/views.py +++ b/src/bk-user/bkuser/apis/login/views.py @@ -34,6 +34,7 @@ TenantRetrieveOutputSLZ, TenantUserMatchInputSLZ, TenantUserMatchOutputSLZ, + TenantUserRetrieveOutputSLZ, ) @@ -184,3 +185,12 @@ def post(self, request, *args, **kwargs): many=True, ) ) + + +class TenantUserRetrieveApi(generics.RetrieveAPIView): + authentication_classes = [BkUserAppAuthentication] + permission_classes = [IsAuthenticated] + + serializer_class = TenantUserRetrieveOutputSLZ + queryset = Tenant.objects.all() + lookup_field = "id"