Add IdentityUserDelegation

pull/16066/head
liangshiwei 3 years ago
parent 146a750392
commit 6424dd2462

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.Identity;
public interface IIdentityUserDelegationRepository: IBasicRepository<IdentityUserDelegation, Guid>
{
Task<List<IdentityUserDelegation>> GetListAsync(
Guid? sourceUserId,
Guid? targetUserId,
CancellationToken cancellationToken = default);
Task<IdentityUserDelegation> FindAsync(
Guid sourceUserId,
Guid targetUserId,
CancellationToken cancellationToken = default);
}

@ -0,0 +1,41 @@
using System;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Identity;
public class IdentityUserDelegation : BasicAggregateRoot<Guid>, IMultiTenant
{
public virtual Guid? TenantId { get; protected set; }
public virtual Guid SourceUserId { get; protected set; }
public virtual Guid TargetUserId { get; protected set; }
public virtual DateTime StartTime { get; protected set; }
public virtual DateTime EndTime { get; protected set; }
/// <summary>
/// Initializes a new instance of <see cref="IdentityUserDelegation"/>.
/// </summary>
protected IdentityUserDelegation()
{
}
public IdentityUserDelegation(
Guid id,
Guid sourceUserId,
Guid targetUserId,
DateTime startTime,
DateTime endTime,
Guid? tenantId = null)
: base(id)
{
TenantId = tenantId;
SourceUserId = sourceUserId;
TargetUserId = targetUserId;
StartTime = startTime;
EndTime = endTime;
}
}

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Services;
namespace Volo.Abp.Identity;
public class IdentityUserDelegationManager : DomainService
{
protected IIdentityUserDelegationRepository IdentityUserDelegationRepository { get; }
public IdentityUserDelegationManager(IIdentityUserDelegationRepository identityUserDelegationRepository)
{
IdentityUserDelegationRepository = identityUserDelegationRepository;
}
public virtual async Task<List<IdentityUserDelegation>> GetListAsync(Guid? sourceUserId = null, Guid? targetUserId = null, CancellationToken cancellationToken = default)
{
return await IdentityUserDelegationRepository.GetListAsync(sourceUserId, targetUserId, cancellationToken: cancellationToken);
}
public virtual async Task DeleteDelegationAsync(Guid id, Guid sourceUserId, CancellationToken cancellationToken = default)
{
var delegation = await IdentityUserDelegationRepository.FindAsync(id, cancellationToken: cancellationToken);
if (delegation != null && delegation.SourceUserId == sourceUserId)
{
await IdentityUserDelegationRepository.DeleteAsync(delegation, cancellationToken: cancellationToken);
}
}
public virtual async Task<bool> IsDelegatedAsync(Guid sourceUserId, Guid targetUserId, CancellationToken cancellationToken = default)
{
return await IdentityUserDelegationRepository.FindAsync(sourceUserId, targetUserId, cancellationToken: cancellationToken) != null;
}
public virtual Task<bool> IsExpiredAsync(IdentityUserDelegation userDelegation)
{
return Task.FromResult(userDelegation.EndTime <= Clock.Now);
}
public virtual async Task<bool> IsValidAsync(IdentityUserDelegation userDelegation)
{
return userDelegation.StartTime <= Clock.Now && !await IsExpiredAsync(userDelegation);
}
}

@ -19,6 +19,7 @@ public class AbpIdentityEntityFrameworkCoreModule : AbpModule
options.AddRepository<OrganizationUnit, EfCoreOrganizationUnitRepository>();
options.AddRepository<IdentitySecurityLog, EFCoreIdentitySecurityLogRepository>();
options.AddRepository<IdentityLinkUser, EfCoreIdentityLinkUserRepository>();
options.AddRepository<IdentityUserDelegation, EfCoreIdentityUserDelegationRepository>();
});
}
}

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.Identity.EntityFrameworkCore;
public class EfCoreIdentityUserDelegationRepository : EfCoreRepository<IIdentityDbContext, IdentityUserDelegation, Guid>, IIdentityUserDelegationRepository
{
public EfCoreIdentityUserDelegationRepository(IDbContextProvider<IIdentityDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public async Task<List<IdentityUserDelegation>> GetListAsync(Guid? sourceUserId, Guid? targetUserId, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.AsNoTracking()
.WhereIf(sourceUserId.HasValue, x => x.SourceUserId == sourceUserId)
.WhereIf(targetUserId.HasValue, x => x.TargetUserId == targetUserId)
.ToListAsync(cancellationToken: cancellationToken);
}
public async Task<IdentityUserDelegation> FindAsync(Guid sourceUserId, Guid targetUserId, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.AsNoTracking()
.FirstOrDefaultAsync(x =>
x.SourceUserId == sourceUserId &&
x.TargetUserId == targetUserId
, cancellationToken: GetCancellationToken(cancellationToken));
}
}

@ -18,4 +18,6 @@ public interface IIdentityDbContext : IEfCoreDbContext
DbSet<IdentitySecurityLog> SecurityLogs { get; }
DbSet<IdentityLinkUser> LinkUsers { get; }
DbSet<IdentityUserDelegation> UserDelegations { get; }
}

@ -22,6 +22,8 @@ public class IdentityDbContext : AbpDbContext<IdentityDbContext>, IIdentityDbCon
public DbSet<IdentityLinkUser> LinkUsers { get; set; }
public DbSet<IdentityUserDelegation> UserDelegations { get; set; }
public IdentityDbContext(DbContextOptions<IdentityDbContext> options)
: base(options)
{

@ -270,6 +270,20 @@ public static class IdentityDbContextModelBuilderExtensions
});
}
builder.Entity<IdentityUserDelegation>(b =>
{
b.ToTable(AbpIdentityDbProperties.DbTablePrefix + "UserDelegations", AbpIdentityDbProperties.DbSchema);
b.ConfigureByConvention();
b.HasIndex(x => new {
x.SourceUserId,
x.TargetUserId,
}).IsUnique();
b.ApplyObjectExtensionMappings();
});
builder.TryConfigureObjectExtensions<IdentityDbContext>();
}
}

@ -19,6 +19,8 @@ public class AbpIdentityMongoDbContext : AbpMongoDbContext, IAbpIdentityMongoDbC
public IMongoCollection<IdentityLinkUser> LinkUsers => Collection<IdentityLinkUser>();
public IMongoCollection<IdentityUserDelegation> UserDelegations => Collection<IdentityUserDelegation>();
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
base.CreateModel(modelBuilder);

@ -37,5 +37,10 @@ public static class AbpIdentityMongoDbContextExtensions
{
b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "LinkUsers";
});
builder.Entity<IdentityUserDelegation>(b =>
{
b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "LinkUsers";
});
}
}

@ -20,6 +20,7 @@ public class AbpIdentityMongoDbModule : AbpModule
options.AddRepository<OrganizationUnit, MongoOrganizationUnitRepository>();
options.AddRepository<IdentitySecurityLog, MongoIdentitySecurityLogRepository>();
options.AddRepository<IdentityLinkUser, MongoIdentityLinkUserRepository>();
options.AddRepository<IdentityUserDelegation, MongoIdentityUserDelegationRepository>();
});
}
}

@ -18,4 +18,6 @@ public interface IAbpIdentityMongoDbContext : IAbpMongoDbContext
IMongoCollection<IdentitySecurityLog> SecurityLogs { get; }
IMongoCollection<IdentityLinkUser> LinkUsers { get; }
IMongoCollection<IdentityUserDelegation> UserDelegations { get; }
}

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
namespace Volo.Abp.Identity.MongoDB;
public class MongoIdentityUserDelegationRepository : MongoDbRepository<IAbpIdentityMongoDbContext, IdentityUserDelegation, Guid>, IIdentityUserDelegationRepository
{
public MongoIdentityUserDelegationRepository(IMongoDbContextProvider<IAbpIdentityMongoDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public async Task<List<IdentityUserDelegation>> GetListAsync(Guid? sourceUserId, Guid? targetUserId,
CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.WhereIf(sourceUserId.HasValue, x => x.SourceUserId == sourceUserId)
.WhereIf(targetUserId.HasValue, x => x.TargetUserId == targetUserId)
.As<IMongoQueryable<IdentityUserDelegation>>()
.ToListAsync(cancellationToken: cancellationToken);
}
public async Task<IdentityUserDelegation> FindAsync(Guid sourceUserId, Guid targetUserId, CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.FirstOrDefaultAsync(x =>
x.SourceUserId == sourceUserId &&
x.TargetUserId == targetUserId
, cancellationToken: GetCancellationToken(cancellationToken));
}
}
Loading…
Cancel
Save