From bcf65ab18d4b0a26b922dbad28ebaf24f5da53ba Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 1 Nov 2023 11:09:44 +0800 Subject: [PATCH 1/6] Add `UserDeletedEventHandler`. --- ...ermissionManagement.Domain.Identity.csproj | 1 + ...ermissionManagementDomainIdentityModule.cs | 6 +++-- .../Identity/UserDeletedEventHandler.cs | 25 +++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj index 30018df86e..35ce121c09 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj @@ -16,6 +16,7 @@ + diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs index e710d5b165..973577ccff 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs @@ -1,13 +1,15 @@ using Volo.Abp.Authorization.Permissions; using Volo.Abp.Identity; using Volo.Abp.Modularity; +using Volo.Abp.Users; namespace Volo.Abp.PermissionManagement.Identity; [DependsOn( typeof(AbpIdentityDomainSharedModule), - typeof(AbpPermissionManagementDomainModule) - )] + typeof(AbpPermissionManagementDomainModule), + typeof(AbpUsersAbstractionModule) +)] public class AbpPermissionManagementDomainIdentityModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs new file mode 100644 index 0000000000..f44373cbda --- /dev/null +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Users; + +namespace Volo.Abp.PermissionManagement.Identity; + +public class UserDeletedEventHandler : + IDistributedEventHandler>, + ITransientDependency +{ + protected IPermissionManager PermissionManager { get; } + + public UserDeletedEventHandler(IPermissionManager permissionManager) + { + PermissionManager = permissionManager; + } + + public async Task HandleEventAsync(EntityDeletedEto eventData) + { + await PermissionManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Name); + } +} From 95e7b1bbc677987c7810097b0bd486e5d6b28419 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 2 Nov 2023 11:30:41 +0800 Subject: [PATCH 2/6] Add `UserDeletedEventHandler` to `SettingManagement.Application`. --- .../Identity/UserDeletedEventHandler.cs | 2 +- ...o.Abp.SettingManagement.Application.csproj | 1 + .../AbpSettingManagementApplicationModule.cs | 4 ++- .../UserDeletedEventHandler.cs | 25 +++++++++++++++++++ .../Abp/SettingManagement/ISettingManager.cs | 2 ++ .../Abp/SettingManagement/SettingManager.cs | 14 ++++++++++- .../SettingManager_User_Tests.cs | 12 +++++++++ 7 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs index f44373cbda..40d7d452c5 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs @@ -20,6 +20,6 @@ public class UserDeletedEventHandler : public async Task HandleEventAsync(EntityDeletedEto eventData) { - await PermissionManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Name); + await PermissionManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Id.ToString()); } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj index 2f911062df..cf94e76ffd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj @@ -13,6 +13,7 @@ + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs index 6e9c5704de..47a13dfd23 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs @@ -2,6 +2,7 @@ using Volo.Abp.Emailing; using Volo.Abp.Modularity; using Volo.Abp.Timing; +using Volo.Abp.Users; namespace Volo.Abp.SettingManagement; @@ -10,7 +11,8 @@ namespace Volo.Abp.SettingManagement; typeof(AbpSettingManagementDomainModule), typeof(AbpSettingManagementApplicationContractsModule), typeof(AbpEmailingModule), - typeof(AbpTimingModule) + typeof(AbpTimingModule), + typeof(AbpUsersAbstractionModule) )] public class AbpSettingManagementApplicationModule : AbpModule { diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs new file mode 100644 index 0000000000..1899ac62ae --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Users; + +namespace Volo.Abp.SettingManagement; + +public class UserDeletedEventHandler : + IDistributedEventHandler>, + ITransientDependency +{ + protected ISettingManager SettingManager { get; } + + public UserDeletedEventHandler(ISettingManager settingManager) + { + SettingManager = settingManager; + } + + public async Task HandleEventAsync(EntityDeletedEto eventData) + { + await SettingManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Id.ToString()); + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs index a907ca2d66..9b718b01c1 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs @@ -12,4 +12,6 @@ public interface ISettingManager Task> GetAllAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true); Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false); + + Task DeleteAsync(string providerName, string providerKey); } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs index 800f2140f5..5439c1213a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs @@ -13,6 +13,7 @@ public class SettingManager : ISettingManager, ISingletonDependency { protected ISettingDefinitionManager SettingDefinitionManager { get; } protected ISettingEncryptionService SettingEncryptionService { get; } + protected ISettingManagementStore SettingManagementStore { get; } protected List Providers => _lazyProviders.Value; protected SettingManagementOptions Options { get; } private readonly Lazy> _lazyProviders; @@ -21,10 +22,12 @@ public class SettingManager : ISettingManager, ISingletonDependency IOptions options, IServiceProvider serviceProvider, ISettingDefinitionManager settingDefinitionManager, - ISettingEncryptionService settingEncryptionService) + ISettingEncryptionService settingEncryptionService, + ISettingManagementStore settingManagementStore) { SettingDefinitionManager = settingDefinitionManager; SettingEncryptionService = settingEncryptionService; + SettingManagementStore = settingManagementStore; Options = options.Value; //TODO: Instead, use IServiceScopeFactory and create a scope..? @@ -160,6 +163,15 @@ public class SettingManager : ISettingManager, ISingletonDependency } } + public virtual async Task DeleteAsync(string providerName, string providerKey) + { + var settings = await SettingManagementStore.GetListAsync(providerName, providerKey); + foreach (var setting in settings) + { + await SettingManagementStore.DeleteAsync(setting.Name, providerName, providerKey); + } + } + protected virtual async Task GetOrNullInternalAsync(string name, string providerName, string providerKey, bool fallback = true) { var setting = await SettingDefinitionManager.GetAsync(name); diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs index c99ff97ac1..b3f97688b1 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs @@ -186,4 +186,16 @@ public class SettingManager_User_Tests : SettingsTestBase (await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User2Id)).ShouldBeNull(); //Does not inherit! (await _settingManager.GetOrNullGlobalAsync("MySettingWithoutInherit")).ShouldBe("default-store-value"); } + + [Fact] + public async Task DeleteAsync() + { + (await _settingManager.GetOrNullForUserAsync("MySetting2", _testData.User1Id)).ShouldBe("user1-store-value"); + (await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User1Id)).ShouldBe("user1-store-value"); + + await _settingManager.DeleteAsync(UserSettingValueProvider.ProviderName, _testData.User1Id.ToString()); + + (await _settingManager.GetOrNullForUserAsync("MySetting2", _testData.User1Id)).ShouldNotBe("user1-store-value"); + (await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User1Id)).ShouldNotBe("user1-store-value"); + } } From 9059198ee9aea3729fde2dd354748ba9b171da67 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 2 Nov 2023 14:06:18 +0800 Subject: [PATCH 3/6] Add unit tests for user/role delete event. --- .../Identity/IdentityRoleAppService_Tests.cs | 22 ++++++++++++++++++- .../Identity/IdentityUserAppService_Tests.cs | 20 +++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs index d9f6d17523..e413add30c 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs @@ -4,6 +4,9 @@ using System.Threading.Tasks; using Xunit; using Shouldly; using Volo.Abp.Application.Dtos; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.PermissionManagement; +using Volo.Abp.PermissionManagement.Identity; namespace Volo.Abp.Identity; @@ -11,11 +14,14 @@ public class IdentityRoleAppService_Tests : AbpIdentityApplicationTestBase { private readonly IIdentityRoleAppService _roleAppService; private readonly IIdentityRoleRepository _roleRepository; - + private readonly IPermissionManager _permissionManager; + private readonly RolePermissionManagementProvider _rolePermissionManagementProvider; public IdentityRoleAppService_Tests() { _roleAppService = GetRequiredService(); _roleRepository = GetRequiredService(); + _permissionManager = GetRequiredService(); + _rolePermissionManagementProvider = GetRequiredService(); } [Fact] @@ -125,6 +131,20 @@ public class IdentityRoleAppService_Tests : AbpIdentityApplicationTestBase (await FindRoleAsync("moderator")).ShouldBeNull(); } + + [Fact] + public async Task Role_Permissions_Should_Deleted_If_Role_Deleted() + { + var moderator = await GetRoleAsync("moderator"); + + (await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeFalse(); + await _permissionManager.SetForRoleAsync(moderator.Name, IdentityPermissions.Users.Create, true); + (await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeTrue(); + + await _roleAppService.DeleteAsync(moderator.Id); + (await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeFalse(); + } + private async Task GetRoleAsync(string roleName) { return (await _roleRepository.GetListAsync()).First(u => u.Name == roleName); diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs index 591cefba3c..3272929c3e 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs @@ -1,7 +1,10 @@ using System; using System.Threading.Tasks; using Shouldly; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; +using Volo.Abp.PermissionManagement; +using Volo.Abp.PermissionManagement.Identity; using Xunit; namespace Volo.Abp.Identity; @@ -10,12 +13,16 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase { private readonly IIdentityUserAppService _userAppService; private readonly IIdentityUserRepository _userRepository; + private readonly IPermissionManager _permissionManager; + private readonly UserPermissionManagementProvider _userPermissionManagementProvider; private readonly IdentityTestData _testData; public IdentityUserAppService_Tests() { _userAppService = GetRequiredService(); _userRepository = GetRequiredService(); + _permissionManager = GetRequiredService(); + _userPermissionManagementProvider = GetRequiredService(); _testData = GetRequiredService(); } @@ -174,6 +181,19 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase FindUser("john.nash").ShouldBeNull(); } + [Fact] + public async Task User_Permissions_Should_Deleted_If_User_Deleted() + { + var johnNash = GetUser("john.nash"); + + (await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeFalse(); + await _permissionManager.SetForUserAsync(johnNash.Id, IdentityPermissions.Users.Create, true); + (await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeTrue(); + + await _userAppService.DeleteAsync(johnNash.Id); + (await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeFalse(); + } + [Fact] public async Task GetRolesAsync() { From 605054835d5cc5a8ab80d8d1995b7088d6959a34 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 2 Nov 2023 16:13:58 +0800 Subject: [PATCH 4/6] Remove all user related thing when deleting a user. --- .../Volo/Abp/Identity/IdentityLinkUserInfo.cs | 2 +- .../Volo/Abp/Identity/IdentityUserManager.cs | 21 ++++- .../Abp/Identity/IdentityUserManager_Tests.cs | 79 ++++++++++++++++--- 3 files changed, 86 insertions(+), 16 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs index 250f6f88d6..d2f5bdbff3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs @@ -8,7 +8,7 @@ public class IdentityLinkUserInfo public virtual Guid? TenantId { get; set; } - public IdentityLinkUserInfo(Guid userId, Guid? tenantId) + public IdentityLinkUserInfo(Guid userId, Guid? tenantId = null) { UserId = userId; TenantId = tenantId; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 5ce3663e14..57b97bfcd7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -11,10 +11,10 @@ using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; using Volo.Abp.EventBus.Distributed; +using Volo.Abp.EventBus.Local; using Volo.Abp.Identity.Settings; using Volo.Abp.Settings; using Volo.Abp.Threading; -using Volo.Abp.Timing; using Volo.Abp.Uow; namespace Volo.Abp.Identity; @@ -27,7 +27,7 @@ public class IdentityUserManager : UserManager, IDomainService protected ISettingProvider SettingProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; } protected IDistributedEventBus DistributedEventBus { get; } - + protected IIdentityLinkUserRepository IdentityLinkUserRepository { get; } protected override CancellationToken CancellationToken => CancellationTokenProvider.Token; public IdentityUserManager( @@ -45,7 +45,8 @@ public class IdentityUserManager : UserManager, IDomainService ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, ISettingProvider settingProvider, - IDistributedEventBus distributedEventBus) + IDistributedEventBus distributedEventBus, + IIdentityLinkUserRepository identityLinkUserRepository) : base( store, optionsAccessor, @@ -62,6 +63,7 @@ public class IdentityUserManager : UserManager, IDomainService DistributedEventBus = distributedEventBus; RoleRepository = roleRepository; UserRepository = userRepository; + IdentityLinkUserRepository = identityLinkUserRepository; CancellationTokenProvider = cancellationTokenProvider; } @@ -76,6 +78,19 @@ public class IdentityUserManager : UserManager, IDomainService return await CreateAsync(user); } + public async override Task DeleteAsync(IdentityUser user) + { + user.Claims.Clear(); + user.Roles.Clear(); + user.Tokens.Clear(); + user.Logins.Clear(); + user.OrganizationUnits.Clear(); + await IdentityLinkUserRepository.DeleteAsync(new IdentityLinkUserInfo(user.Id, user.TenantId), CancellationToken); + await UpdateAsync(user); + + return await base.DeleteAsync(user); + } + public virtual async Task GetByIdAsync(Guid id) { var user = await Store.FindByIdAsync(id.ToString(), CancellationToken); diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs index 191972d13b..ec29d3d29a 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; @@ -26,8 +27,10 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IdentityTestData _testData; private readonly ICurrentTenant _currentTenant; - protected IOptions _identityOptions { get; } - protected IDistributedEventBus DistributedEventBus { get; set; } + private readonly IOptions _identityOptions; + private readonly IdentityLinkUserManager _identityLinkUserManager; + + private IDistributedEventBus _distributedEventBus { get; set; } public IdentityUserManager_Tests() { @@ -40,12 +43,13 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase _unitOfWorkManager = GetRequiredService(); _currentTenant = GetRequiredService(); _identityOptions = GetRequiredService>(); + _identityLinkUserManager = GetRequiredService(); } protected override void AfterAddApplication(IServiceCollection services) { - DistributedEventBus = Substitute.For(); - services.Replace(ServiceDescriptor.Singleton(DistributedEventBus)); + _distributedEventBus = Substitute.For(); + services.Replace(ServiceDescriptor.Singleton(_distributedEventBus)); } [Fact] @@ -270,7 +274,7 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase (await _identityUserManager.CreateAsync(user)).CheckErrors(); - await DistributedEventBus.DidNotReceive() + await _distributedEventBus.DidNotReceive() .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); @@ -280,16 +284,16 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase { var oldUsername = newUser.UserName; await _identityUserManager.SetUserNameAsync(newUser, "newUserName"); - await DistributedEventBus.Received() + await _distributedEventBus.Received() .PublishAsync( Arg.Is(x => x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldUserName == oldUsername && x.UserName == "newUserName"), Arg.Any(), Arg.Any()); } - DistributedEventBus.ClearReceivedCalls(); + _distributedEventBus.ClearReceivedCalls(); await _identityUserManager.SetUserNameAsync(newUser, newUser.UserName); - await DistributedEventBus.DidNotReceive() + await _distributedEventBus.DidNotReceive() .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); } @@ -300,7 +304,7 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase (await _identityUserManager.CreateAsync(user)).CheckErrors(); - await DistributedEventBus.DidNotReceive() + await _distributedEventBus.DidNotReceive() .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); @@ -310,19 +314,70 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase { var oldEmail = newUser.Email; await _identityUserManager.SetEmailAsync(newUser, "newEmail@abp.io"); - await DistributedEventBus.Received() + await _distributedEventBus.Received() .PublishAsync( Arg.Is(x => x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldEmail == oldEmail && x.Email == "newEmail@abp.io"), Arg.Any(), Arg.Any()); } - DistributedEventBus.ClearReceivedCalls(); + _distributedEventBus.ClearReceivedCalls(); await _identityUserManager.SetEmailAsync(newUser, newUser.Email); - await DistributedEventBus.DidNotReceive() + await _distributedEventBus.DidNotReceive() .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); } + [Fact] + public async Task DeleteAsync() + { + await CreateRandomDefaultRoleAsync(); + var user = CreateRandomUser(); + (await _identityUserManager.CreateAsync(user)).CheckErrors(); + + var user2 = CreateRandomUser(); + (await _identityUserManager.CreateAsync(user2)).CheckErrors(); + + using (var uow = _unitOfWorkManager.Begin()) + { + user = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + user.ShouldNotBeNull(); + + await _identityUserManager.AddClaimAsync(user, new Claim("test", "test")); + await _identityUserManager.AddLoginAsync(user, new UserLoginInfo("test", "test", "test")); + await _identityUserManager.AddDefaultRolesAsync(user); + user.SetToken("test", "test", "test"); + var ou = await _organizationUnitRepository.GetAsync(_lookupNormalizer.NormalizeName("OU11")); + await _identityUserManager.AddToOrganizationUnitAsync(user, ou); + await _identityLinkUserManager.LinkAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id)); + + await uow.CompleteAsync(); + } + + using (var uow = _unitOfWorkManager.Begin()) + { + user = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + user.ShouldNotBeNull(); + + user.Claims.Count.ShouldBeGreaterThan(0); + user.Logins.Count.ShouldBeGreaterThan(0); + user.Roles.Count.ShouldBeGreaterThan(0); + user.Tokens.Count.ShouldBeGreaterThan(0); + user.OrganizationUnits.Count.ShouldBeGreaterThan(0); + (await _identityLinkUserManager.IsLinkedAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id))).ShouldBeTrue(); + + await _identityUserManager.DeleteAsync(user); + + user.Claims.Count.ShouldBe(0); + user.Logins.Count.ShouldBe(0); + user.Roles.Count.ShouldBe(0); + user.Tokens.Count.ShouldBe(0); + user.OrganizationUnits.Count.ShouldBe(0); + (await _identityLinkUserManager.IsLinkedAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id))).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } + private async Task CreateRandomDefaultRoleAsync() { await _identityRoleRepository.InsertAsync( From 02b6ea9561bd47bda53fb6c7015767eeb912bef7 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 2 Nov 2023 16:52:18 +0800 Subject: [PATCH 5/6] Use `UserSettingValueProvider` instead `UserPermissionValueProvider`. --- .../Volo/Abp/SettingManagement/UserDeletedEventHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs index 1899ac62ae..5bc3fe9f9d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; -using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Settings; using Volo.Abp.Users; namespace Volo.Abp.SettingManagement; @@ -20,6 +20,6 @@ public class UserDeletedEventHandler : public async Task HandleEventAsync(EntityDeletedEto eventData) { - await SettingManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Id.ToString()); + await SettingManager.DeleteAsync(UserSettingValueProvider.ProviderName, eventData.Entity.Id.ToString()); } } From 89e53b3c2849a4e5f707735406ffec3087540ef4 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 6 Nov 2023 09:07:01 +0800 Subject: [PATCH 6/6] Make the `HandleEventAsync` method UOW. --- .../PermissionManagement/Identity/RoleDeletedEventHandler.cs | 4 +++- .../PermissionManagement/Identity/UserDeletedEventHandler.cs | 4 +++- .../Volo/Abp/SettingManagement/UserDeletedEventHandler.cs | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs index 38a9578c9d..cb63b2681a 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs @@ -5,6 +5,7 @@ using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.EventBus; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity; +using Volo.Abp.Uow; namespace Volo.Abp.PermissionManagement.Identity; @@ -19,7 +20,8 @@ public class RoleDeletedEventHandler : PermissionManager = permissionManager; } - public async Task HandleEventAsync(EntityDeletedEto eventData) + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) { await PermissionManager.DeleteAsync(RolePermissionValueProvider.ProviderName, eventData.Entity.Name); } diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs index 40d7d452c5..35aaba29ae 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs @@ -3,6 +3,7 @@ using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Uow; using Volo.Abp.Users; namespace Volo.Abp.PermissionManagement.Identity; @@ -18,7 +19,8 @@ public class UserDeletedEventHandler : PermissionManager = permissionManager; } - public async Task HandleEventAsync(EntityDeletedEto eventData) + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) { await PermissionManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Id.ToString()); } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs index 5bc3fe9f9d..d54b94d8da 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs @@ -3,6 +3,7 @@ using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Settings; +using Volo.Abp.Uow; using Volo.Abp.Users; namespace Volo.Abp.SettingManagement; @@ -18,7 +19,8 @@ public class UserDeletedEventHandler : SettingManager = settingManager; } - public async Task HandleEventAsync(EntityDeletedEto eventData) + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) { await SettingManager.DeleteAsync(UserSettingValueProvider.ProviderName, eventData.Entity.Id.ToString()); }