Browse Source

Filter users if a role comes from an organization unit

pull/18754/head
liangshiwei 2 years ago
parent
commit
c415180bf4
  1. 15
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs
  2. 15
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs
  3. 4
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs

15
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs

@ -197,9 +197,19 @@ public class EfCoreIdentityUserRepository : EfCoreRepository<IIdentityDbContext,
DateTime? minModifitionTime = null,
CancellationToken cancellationToken = default)
{
var upperFilter = filter?.ToUpperInvariant();
return await (await GetDbSetAsync())
.IncludeDetails(includeDetails)
var query = (await GetDbSetAsync())
.IncludeDetails(includeDetails);
if (roleId.HasValue)
{
var dbContext = await GetDbContextAsync();
var organizationUnitIds = await dbContext.Set<OrganizationUnitRole>().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<IIdentityDbContext,
(u.Surname != null && u.Surname.Contains(filter)) ||
(u.PhoneNumber != null && u.PhoneNumber.Contains(filter))
)
.WhereIf(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))

15
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs

@ -166,7 +166,19 @@ public class MongoIdentityUserRepository : MongoDbRepository<IAbpIdentityMongoDb
CancellationToken cancellationToken = default)
{
var upperFilter = filter?.ToUpperInvariant();
return await (await GetMongoQueryableAsync(cancellationToken))
var query = await GetMongoQueryableAsync(cancellationToken);
if (roleId.HasValue)
{
var organizationUnitIds = (await GetMongoQueryableAsync<OrganizationUnit>(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<IdentityUser, IMongoQueryable<IdentityUser>>(
!filter.IsNullOrWhiteSpace(),
u =>
@ -176,7 +188,6 @@ public class MongoIdentityUserRepository : MongoDbRepository<IAbpIdentityMongoDb
(u.Surname != null && u.Surname.Contains(filter)) ||
(u.PhoneNumber != null && u.PhoneNumber.Contains(filter))
)
.WhereIf<IdentityUser, IMongoQueryable<IdentityUser>>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value))
.WhereIf<IdentityUser, IMongoQueryable<IdentityUser>>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value))
.WhereIf<IdentityUser, IMongoQueryable<IdentityUser>>(!string.IsNullOrWhiteSpace(userName), x => x.UserName.Contains(userName))
.WhereIf<IdentityUser, IMongoQueryable<IdentityUser>>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber.Contains(phoneNumber))

4
modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs

@ -159,6 +159,10 @@ public abstract class IdentityUserRepository_Tests<TStartupModule> : 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);

Loading…
Cancel
Save