Skip to content

Commit 9bf3bc3

Browse files
authored
Merge pull request #424 from ImMin5/master
Add user_groups info at token payload
2 parents 76a9ece + ca170f7 commit 9bf3bc3

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

src/spaceone/identity/lib/key_generator.py

+5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def generate_token(
4040
role_type: str = None,
4141
workspace_id: str = None,
4242
permissions: list = None,
43+
users_group: list = None,
4344
projects: list = None,
4445
injected_params: dict = None,
4546
identity_base_url: str = None,
@@ -72,6 +73,9 @@ def generate_token(
7273
if projects and len(projects) > 0:
7374
payload["projects"] = projects
7475

76+
if users_group and len(users_group) > 0:
77+
payload["user_groups"] = users_group
78+
7579
if injected_params:
7680
payload["injected_params"] = injected_params
7781

@@ -98,6 +102,7 @@ def _print_key(payload: dict):
98102
f'iat: {payload.get("iat")}, '
99103
f'jti: {payload.get("jti")}, '
100104
f'projects: {payload.get("projects")},'
105+
f'user_groups: {payload.get("user_groups")},'
101106
f'permissions: {payload.get("permissions")},'
102107
f'injected_params: {payload.get("injected_params")},'
103108
f'identity_base_url: {payload.get("identity_base_url")},'

src/spaceone/identity/manager/token_manager/base.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def issue_token(
4747
timeout=None,
4848
permissions=None,
4949
projects=None,
50+
user_groups=None,
5051
app_id=None,
5152
):
5253
if self.is_authenticated is False:
@@ -78,6 +79,7 @@ def issue_token(
7879
workspace_id=workspace_id,
7980
permissions=permissions,
8081
projects=projects,
82+
users_group=user_groups,
8183
identity_base_url=identity_base_url,
8284
)
8385

@@ -156,7 +158,9 @@ def check_verify_code(user_id, domain_id, verify_code):
156158
@staticmethod
157159
def _generate_verify_code(length: int = 6) -> str:
158160
first_digit = str(secrets.randbelow(9) + 1)
159-
remaining_digits = ''.join(str(secrets.randbelow(10)) for _ in range(length - 1))
161+
remaining_digits = "".join(
162+
str(secrets.randbelow(10)) for _ in range(length - 1)
163+
)
160164
verify_code = first_digit + remaining_digits
161165
return verify_code
162166

src/spaceone/identity/service/token_service.py

+21
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from spaceone.identity.manager.role_manager import RoleManager
2525
from spaceone.identity.manager.system_manager import SystemManager
2626
from spaceone.identity.manager.token_manager.base import TokenManager
27+
from spaceone.identity.manager.user_group_manager import UserGroupManager
2728
from spaceone.identity.manager.user_manager import UserManager
2829
from spaceone.identity.manager.workspace_manager import WorkspaceManager
2930
from spaceone.identity.model.app.database import App
@@ -44,6 +45,7 @@ def __init__(self, *args, **kwargs):
4445
self.domain_mgr = DomainManager()
4546
self.domain_secret_mgr = DomainSecretManager()
4647
self.user_mgr = UserManager()
48+
self.user_group_mgr = UserGroupManager()
4749
self.app_mgr = AppManager()
4850
self.rb_mgr = RoleBindingManager()
4951
self.role_mgr = RoleManager()
@@ -254,6 +256,14 @@ def grant(self, params: TokenGrantRequest) -> Union[GrantTokenResponse, dict]:
254256
else:
255257
user_projects = None
256258

259+
# get user groups in workspace
260+
if params.scope == "WORKSPACE":
261+
user_groups = self._get_user_groups_in_workspace(
262+
domain_id, params.workspace_id, user_vo.user_id
263+
)
264+
else:
265+
user_groups = None
266+
257267
token_info = token_mgr.issue_token(
258268
private_jwk,
259269
refresh_private_jwk,
@@ -262,6 +272,7 @@ def grant(self, params: TokenGrantRequest) -> Union[GrantTokenResponse, dict]:
262272
workspace_id=params.workspace_id,
263273
permissions=permissions,
264274
projects=user_projects,
275+
user_groups=user_groups,
265276
app_id=app_id, # todo : remove
266277
)
267278

@@ -392,6 +403,16 @@ def _get_user_projects_in_project_group(
392403
user_projects = list(set(user_projects))
393404
return user_projects
394405

406+
def _get_user_groups_in_workspace(
407+
self, domain_id: str, workspace_id: str, user_id: str
408+
) -> list:
409+
user_group_vos = self.user_group_mgr.filter_user_groups(
410+
domain_id=domain_id, workspace_id=workspace_id, users=[user_id]
411+
)
412+
user_groups = [user_group_vo.user_group_id for user_group_vo in user_group_vos]
413+
414+
return user_groups
415+
395416
def _get_user_projects(
396417
self, user_id: str, workspace_id: str, domain_id: str
397418
) -> List[str]:

0 commit comments

Comments
 (0)