diff --git a/apps/vben5/apps/app-antd/src/layouts/basic.vue b/apps/vben5/apps/app-antd/src/layouts/basic.vue index 7eb2328bf..507ee63d8 100644 --- a/apps/vben5/apps/app-antd/src/layouts/basic.vue +++ b/apps/vben5/apps/app-antd/src/layouts/basic.vue @@ -28,8 +28,8 @@ import { useAuthStore } from '#/store'; import LoginForm from '#/views/_core/authentication/login.vue'; const UserSettingsIcon = createIconifyIcon('tdesign:user-setting'); -const UserLinkIcon = createIconifyIcon('material-symbols-light:link'); -const BckLoginIcon = createIconifyIcon('lets-icons:back-light'); +const UserLinkIcon = createIconifyIcon('material-symbols:link'); +const BckLoginIcon = createIconifyIcon('mingcute:back-line'); const notifications = ref([]); diff --git a/apps/vben5/apps/app-antd/src/views/saas/tenants/index.vue b/apps/vben5/apps/app-antd/src/views/saas/tenants/index.vue index a66eccb0b..d30661fdf 100644 --- a/apps/vben5/apps/app-antd/src/views/saas/tenants/index.vue +++ b/apps/vben5/apps/app-antd/src/views/saas/tenants/index.vue @@ -1,15 +1,101 @@ diff --git a/apps/vben5/packages/@abp/account/src/utils/auth.ts b/apps/vben5/packages/@abp/account/src/utils/auth.ts index 9e3c78ec7..b1e03bf1d 100644 --- a/apps/vben5/packages/@abp/account/src/utils/auth.ts +++ b/apps/vben5/packages/@abp/account/src/utils/auth.ts @@ -88,6 +88,9 @@ class AbpUserManager extends UserManager { if (params.userDelegationId) { body.set('UserDelegationId', params.userDelegationId); } + if (params.tenantId) { + body.set('TenantId', params.tenantId); + } if (params.tenantUserName) { body.set('TenantUserName', params.tenantUserName); } diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue index e7973cee5..5539e5d79 100644 --- a/apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue @@ -21,6 +21,7 @@ import { DeleteOutlined, EditOutlined, EllipsisOutlined, + LoginOutlined, PlusOutlined, } from '@ant-design/icons-vue'; import { Button, Dropdown, Menu, message, Modal } from 'ant-design-vue'; @@ -32,7 +33,12 @@ defineOptions({ name: 'EditionTable', }); +const emit = defineEmits<{ + (event: 'impersonation', tenant: TenantDto): void; +}>(); + const MenuItem = Menu.Item; +const MenuDivider = Menu.Divider; const CheckIcon = createIconifyIcon('ant-design:check-outlined'); const CloseIcon = createIconifyIcon('ant-design:close-outlined'); const AuditLogIcon = createIconifyIcon('fluent-mdl2:compliance-audit'); @@ -210,6 +216,10 @@ const onMenuClick = (row: TenantDto, info: MenuInfo) => { providerName: 'T', }); tenantFeatureModalApi.open(); + break; + } + case 'impersonation': { + emit('impersonation', row); } } }; @@ -273,6 +283,15 @@ const onMenuClick = (row: TenantDto, info: MenuInfo) => { > {{ $t('AbpSaas.ManageFeatures') }} + + + {{ $t('AbpSaas.ImpersonationTenant') }} + + >(context); var currentUser = GetRequiredService(context); - var currentTenant = GetRequiredService(context); var currentPrincipalAccessor = GetRequiredService(context); var principal = await userClaimsPrincipalFactory.CreateAsync(targetUser); @@ -322,9 +328,13 @@ public class ImpersonationTokenExtensionGrant : ITokenExtensionGrant claims.Add(new Claim(AbpClaimTypes.ImpersonatorUserId, currentUser.Id!.Value.ToString())); claims.Add(new Claim(AbpClaimTypes.ImpersonatorUserName, currentUser.UserName!)); - if (currentTenant.IsAvailable) + if (tenantId.HasValue) + { + claims.Add(new Claim(AbpClaimTypes.ImpersonatorTenantId, tenantId.Value.ToString())); + } + if (!tenantName.IsNullOrWhiteSpace()) { - claims.Add(new Claim(AbpClaimTypes.ImpersonatorTenantId, currentTenant.Id!.Value.ToString())); + claims.Add(new Claim(AbpClaimTypes.ImpersonatorTenantName, tenantName)); } }