From f69f776622acad4cf83cb9ce69242ba7fd23aa8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 4 Jun 2024 14:58:46 +0800 Subject: [PATCH] fix(keystone): show user group info for user (#20468) --- pkg/apis/identity/user.go | 9 +++++++++ pkg/keystone/models/users.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/pkg/apis/identity/user.go b/pkg/apis/identity/user.go index 90be044248..babedc6236 100644 --- a/pkg/apis/identity/user.go +++ b/pkg/apis/identity/user.go @@ -23,6 +23,13 @@ const ( PasswordResetHintExpire = "expire" ) +type SUserGroup struct { + Id string + Name string + Domain string + DomainId string +} + type UserDetails struct { EnabledIdentityBaseResourceDetails // IdpResourceInfo @@ -36,6 +43,8 @@ type UserDetails struct { // 用户归属的的项目信息 Projects []SFetchDomainObjectWithMetadata `json:"projects"` + // 用户归属的组 + Groups []SUserGroup `json:"groups"` } type UserUsage struct { diff --git a/pkg/keystone/models/users.go b/pkg/keystone/models/users.go index 0df395fa56..fffafbb7a1 100644 --- a/pkg/keystone/models/users.go +++ b/pkg/keystone/models/users.go @@ -761,10 +761,44 @@ func (manager *SUserManager) FetchCustomizeColumns( projectMap[p.UserId] = append(projectMap[p.UserId], p.SFetchDomainObjectWithMetadata) } + groups := GroupManager.Query().SubQuery() + domains = DomainManager.Query().SubQuery() + ugs := UsergroupManager.Query().In("user_id", userIds).SubQuery() + + q = groups.Query( + groups.Field("id"), + groups.Field("name"), + domains.Field("id").Label("domain_id"), + domains.Field("name").Label("domain"), + ugs.Field("user_id"), + ) + + q = q.Join(domains, sqlchemy.Equals(groups.Field("domain_id"), domains.Field("id"))) + q = q.Join(ugs, sqlchemy.Equals(groups.Field("id"), ugs.Field("group_id"))) + + useGroups := []struct { + api.SUserGroup + UserId string + }{} + err = q.All(&useGroups) + if err != nil { + log.Errorf("query user groups error: %v", err) + return rows + } + groupMap := map[string][]api.SUserGroup{} + for _, ug := range useGroups { + _, ok := groupMap[ug.UserId] + if !ok { + groupMap[ug.UserId] = []api.SUserGroup{} + } + groupMap[ug.UserId] = append(groupMap[ug.UserId], ug.SUserGroup) + } + for i := range rows { rows[i].ExternalResourceInfo, _ = scopeResources[userIds[i]] rows[i].UserUsage, _ = usage[userIds[i]] rows[i].Projects, _ = projectMap[userIds[i]] + rows[i].Groups, _ = groupMap[userIds[i]] } return rows