Skip to content

Commit 9b78eb9

Browse files
authored
fix(tenant): add tenant mode/id for jwt app, and tenant_id for jwt user (TencentBlueKing#206)
1 parent a1fa355 commit 9b78eb9

5 files changed

Lines changed: 35 additions & 14 deletions

File tree

sdks/apigw-manager/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "apigw-manager"
3-
version = "4.0.0"
3+
version = "4.0.1"
44
description = "The SDK for managing blueking gateway resource."
55
readme = "README.md"
66
authors = ["blueking <blueking@tencent.com>"]

sdks/apigw-manager/src/apigw_manager/apigw/authentication.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,17 @@ class ApiGatewayJWTGenericMiddleware(ApiGatewayJWTMiddleware):
8383
class ApiGatewayJWTAppMiddleware:
8484
"""Read the JWT information to set the request.app attribute"""
8585

86-
App = namedtuple("App", ["bk_app_code", "verified"])
86+
App = namedtuple("App", ["bk_app_code", "verified", "tenant_mode", "tenant_id"])
8787

8888
def __init__(self, get_response):
8989
self.get_response = get_response
9090

91-
def make_app(self, bk_app_code=None, verified=False, **jwt_app):
91+
def make_app(self, bk_app_code=None, verified=False, tenant_mode="", tenant_id="", **jwt_app):
9292
return self.App(
9393
bk_app_code=bk_app_code,
9494
verified=verified,
95+
tenant_mode=tenant_mode,
96+
tenant_id=tenant_id,
9597
)
9698

9799
def __call__(self, request):
@@ -111,13 +113,18 @@ class ApiGatewayJWTUserMiddleware:
111113
def __init__(self, get_response):
112114
self.get_response = get_response
113115

114-
def get_user(self, request, gateway_name=None, bk_username=None, verified=False, **credentials):
116+
def get_user(self, request, gateway_name=None, bk_username=None, tenant_id=None, verified=False, **credentials):
115117
# 传递 gateway_name 参数的用途:
116118
# 1. 来明确标识这个请求来自于网关
117119
# 2. 用户已经过认证,后端无需再认证
118120
# 3. 避免非预期调用激活对应后端使得用户认证被绕过
119121
return auth.authenticate(
120-
request, gateway_name=gateway_name, bk_username=bk_username, verified=verified, **credentials
122+
request,
123+
gateway_name=gateway_name,
124+
bk_username=bk_username,
125+
tenant_id=tenant_id,
126+
verified=verified,
127+
**credentials,
121128
)
122129

123130
def __call__(self, request):
@@ -151,9 +158,14 @@ def __init__(self):
151158
def make_anonymous_user(self, bk_username=None):
152159
user = AnonymousUser()
153160
user.username = bk_username # type: ignore
161+
# set the tenant_id
162+
user.tenant_id = "" # type: ignore
154163
return user
155164

156-
def authenticate(self, request, gateway_name, bk_username, verified, **credentials):
165+
def authenticate(self, request, gateway_name, bk_username, tenant_id, verified, **credentials):
157166
if not verified:
158167
return self.make_anonymous_user(bk_username=bk_username)
159-
return self.user_maker(bk_username)
168+
169+
user = self.user_maker(bk_username)
170+
user.tenant_id = tenant_id # type: ignore
171+
return user

sdks/apigw-manager/src/apigw_manager/core/handler.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ def _call(self, operation, files=None, **kwargs):
8282
"data": kwargs,
8383
"headers": {
8484
"X-Bkapi-Authorization": kwargs.pop("x_bkapi_authorization", self._get_bkapi_authorization()),
85+
# the header is required by the API gateway plugin bk-tenant-validate, for global tenant app!
86+
# so we set it to system, it would not be used in the gateway
87+
"X-Bk-Tenant-Id": "system",
8588
},
8689
"files": files,
8790
}

sdks/apigw-manager/src/apigw_manager/drf/authentication.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@
1111
from collections import namedtuple
1212
from typing import ClassVar, Type
1313

14-
from apigw_manager.apigw.providers import CachePublicKeyProvider, PublicKeyProvider
15-
from apigw_manager.apigw.utils import get_configuration
1614
from django.conf import settings
1715
from django.contrib import auth
1816
from django.utils.module_loading import import_string
1917
from rest_framework.authentication import BaseAuthentication
2018

19+
from apigw_manager.apigw.providers import CachePublicKeyProvider, PublicKeyProvider
20+
from apigw_manager.apigw.utils import get_configuration
21+
2122
logger = logging.getLogger(__name__)
2223

23-
App = namedtuple("App", ["bk_app_code", "verified"])
24+
App = namedtuple("App", ["bk_app_code", "verified", "tenant_mode", "tenant_id"])
2425

2526

2627
class ApiGatewayJWTAuthentication(BaseAuthentication):
@@ -81,10 +82,12 @@ def authenticate(self, request):
8182
def authenticate_header(self, request):
8283
return self.JWT_KEY_NAME
8384

84-
def make_app(self, bk_app_code=None, verified=False, **jwt_app) -> App:
85+
def make_app(self, bk_app_code=None, verified=False, tenant_mode="", tenant_id="", **jwt_app) -> App:
8586
return App(
8687
bk_app_code=bk_app_code,
8788
verified=verified,
89+
tenant_mode=tenant_mode,
90+
tenant_id=tenant_id,
8891
)
8992

9093
def get_user(

sdks/apigw-manager/tests/apigw_manager/apigw/test_authentication.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from apigw_manager.apigw import authentication, providers
1717
from apigw_manager.apigw.providers import CachePublicKeyProvider, DefaultJWTProvider, SettingsPublicKeyProvider
1818

19-
2019
@pytest.fixture()
2120
def mock_response(mocker):
2221
return mocker.MagicMock()
@@ -243,13 +242,17 @@ def _setup_backend(self):
243242
self.backend = authentication.UserModelBackend()
244243

245244
def test_authenticate_user(self, mock_request):
246-
user = self.backend.authenticate(mock_request, gateway_name="test", bk_username="admin", verified=True)
245+
user = self.backend.authenticate(
246+
mock_request, gateway_name="test", bk_username="admin", tenant_id="system", verified=True
247+
)
247248
assert not isinstance(user, AnonymousUser)
248249
assert user.username == "admin"
249250
assert user.is_authenticated is True
250251

251252
def test_authenticate_anonymous_user(self, mock_request):
252-
user = self.backend.authenticate(mock_request, gateway_name="test", bk_username="admin", verified=False)
253+
user = self.backend.authenticate(
254+
mock_request, gateway_name="test", bk_username="admin", tenant_id="system", verified=False
255+
)
253256
assert isinstance(user, AnonymousUser)
254257
assert user.username == "admin"
255258
assert user.is_authenticated is False

0 commit comments

Comments
 (0)