From c415180bf40fa162186198695efb030220d15252 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 12 Jan 2024 15:36:41 +0800 Subject: [PATCH] Filter users if a role comes from an organization unit --- .../EfCoreIdentityUserRepository.cs | 15 ++++++++++++--- .../MongoDB/MongoIdentityUserRepository.cs | 15 +++++++++++++-- .../Abp/Identity/IdentityUserRepository_Tests.cs | 4 ++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index 75ff06afe9..bbaa8087f4 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -197,9 +197,19 @@ public class EfCoreIdentityUserRepository : EfCoreRepository().Where(q => q.RoleId == roleId.Value).Select(q => q.OrganizationUnitId).ToArrayAsync(cancellationToken: cancellationToken); + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return await query .WhereIf( !filter.IsNullOrWhiteSpace(), u => @@ -209,7 +219,6 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName.Contains(userName)) .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber.Contains(phoneNumber)) diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index f93586ed79..aab3e3c63a 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -166,7 +166,19 @@ public class MongoIdentityUserRepository : MongoDbRepository(cancellationToken)) + .Where(ou => ou.Roles.Any(r => r.RoleId == roleId.Value)) + .Select(userOrganizationUnit => userOrganizationUnit.Id) + .ToArray(); + + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return await query .WhereIf>( !filter.IsNullOrWhiteSpace(), u => @@ -176,7 +188,6 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName.Contains(userName)) .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber.Contains(phoneNumber)) diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs index 2516e0c09b..e81c0cbd38 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs @@ -159,6 +159,10 @@ public abstract class IdentityUserRepository_Tests : AbpIdentity StringComparison.OrdinalIgnoreCase ).ShouldBeGreaterThan(0); } + + users = await UserRepository.GetListAsync(null, 5, 0, null, roleId: TestData.RoleManagerId); + users.ShouldContain(x => x.UserName == "john.nash"); + users.ShouldContain(x => x.UserName == "neo"); users = await UserRepository.GetListAsync(null, 999, 0, "undefined-username"); users.Count.ShouldBe(0);