From e56d49ed37af2f8e944ada290794bea7cdada466 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 24 Nov 2023 11:21:12 +0800 Subject: [PATCH] Add `IdentitySession` entity. --- .../Abp/Identity/IdentitySessionConsts.cs | 10 +++ .../Identity/IIdentitySessionRepository.cs | 9 +++ .../Volo/Abp/Identity/IdentitySession.cs | 81 +++++++++++++++++++ .../AbpIdentityEntityFrameworkCoreModule.cs | 1 + .../EfCoreIdentitySessionRepository.cs | 15 ++++ .../EntityFrameworkCore/IIdentityDbContext.cs | 2 + .../EntityFrameworkCore/IdentityDbContext.cs | 2 + ...IdentityDbContextModelBuilderExtensions.cs | 16 ++++ .../MongoDB/AbpIdentityMongoDbContext.cs | 2 + .../AbpIdentityMongoDbContextExtensions.cs | 5 ++ .../MongoDB/AbpIdentityMongoDbModule.cs | 1 + .../MongoDB/IAbpIdentityMongoDbContext.cs | 2 + .../MongoDB/MongoIdentitySessionRepository.cs | 14 ++++ 13 files changed, 160 insertions(+) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs new file mode 100644 index 0000000000..7182afa28e --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.Identity; + +public class IdentitySessionConsts +{ + public static int MaxDeviceLength { get; set; } = 128; + + public static int MaxClientIdLength { get; set; } = 64; + + public static int MaxIpAddressesLength { get; set; } = 256; +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs new file mode 100644 index 0000000000..2cb0875674 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs @@ -0,0 +1,9 @@ +using System; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.Identity; + +public interface IIdentitySessionRepository : IBasicRepository +{ + +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs new file mode 100644 index 0000000000..0dd53c5f74 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Identity; + +public class IdentitySession : BasicAggregateRoot +{ + /// + /// Web, CLI, STUDIO, ... + /// + public virtual string Device { get; protected set; } + + public virtual Guid? TenantId { get; protected set; } + + public virtual Guid UserId { get; protected set; } + + public virtual string ClientId { get; set; } + + public virtual string IpAddresses { get; protected set; } + + public virtual DateTime SignedIn { get; protected set; } + + public virtual DateTime? LastAccessed { get; protected set; } + + protected IdentitySession() + { + + } + + public IdentitySession( + Guid id, + string device, + Guid userId, + Guid? tenantId, + string clientId, + string ipAddresses, + DateTime signedIn, + DateTime? lastAccessed) + { + Id = id; + Device = device; + UserId = userId; + TenantId = tenantId; + ClientId = clientId; + IpAddresses = ipAddresses; + SignedIn = signedIn; + LastAccessed = lastAccessed; + } + + public void SetSignedInTime(DateTime signedIn) + { + SignedIn = signedIn; + } + + public void UpdateLastAccessedTime(DateTime? lastAccessed) + { + LastAccessed = lastAccessed; + } + + public void SetIpAddresses(IEnumerable ipAddresses) + { + IpAddresses = JoinAsString(ipAddresses); + } + + public IEnumerable GetIpAddresses() + { + return GetArrayFromString(IpAddresses); + } + + private static string JoinAsString(IEnumerable list) + { + var serialized = string.Join(",", list); + return serialized.IsNullOrWhiteSpace() ? null : serialized; + } + + private string[] GetArrayFromString(string str) + { + return str?.Split(",", StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty(); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs index a58a73a996..16433977d7 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs @@ -20,6 +20,7 @@ public class AbpIdentityEntityFrameworkCoreModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs new file mode 100644 index 0000000000..e86e57d0ee --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs @@ -0,0 +1,15 @@ +using System; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Volo.Abp.Identity.EntityFrameworkCore; + +public class EfCoreIdentitySessionRepository : EfCoreRepository, IIdentitySessionRepository +{ + public EfCoreIdentitySessionRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + + } + +} diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs index 2f409a61b2..6fe3b8dd9b 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs @@ -20,4 +20,6 @@ public interface IIdentityDbContext : IEfCoreDbContext DbSet LinkUsers { get; } DbSet UserDelegations { get; } + + DbSet Sessions { get; } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs index 79adece5e1..3bb7777cb4 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs @@ -24,6 +24,8 @@ public class IdentityDbContext : AbpDbContext, IIdentityDbCon public DbSet UserDelegations { get; set; } + public DbSet Sessions { get; set; } + public IdentityDbContext(DbContextOptions options) : base(options) { diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs index f85f72e84e..6258f1b24b 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs @@ -279,6 +279,22 @@ public static class IdentityDbContextModelBuilderExtensions b.ApplyObjectExtensionMappings(); }); + builder.Entity(b => + { + b.ToTable(AbpIdentityDbProperties.DbTablePrefix + "Sessions", AbpIdentityDbProperties.DbSchema); + + b.ConfigureByConvention(); + + b.Property(x => x.Device).HasMaxLength(IdentitySessionConsts.MaxDeviceLength).IsRequired(); + b.Property(x => x.ClientId).HasMaxLength(IdentitySessionConsts.MaxClientIdLength); + b.Property(x => x.IpAddresses).HasMaxLength(IdentitySessionConsts.MaxIpAddressesLength); + + b.HasIndex(x => new { x.Device }); + b.HasIndex(x => new { x.TenantId, x.UserId }); + + b.ApplyObjectExtensionMappings(); + }); + builder.TryConfigureObjectExtensions(); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs index 90118a534e..86995f5472 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs @@ -21,6 +21,8 @@ public class AbpIdentityMongoDbContext : AbpMongoDbContext, IAbpIdentityMongoDbC public IMongoCollection UserDelegations => Collection(); + public IMongoCollection Sessions => Collection(); + protected override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs index 5ee7ffc47e..4ccb9fe7f7 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs @@ -42,5 +42,10 @@ public static class AbpIdentityMongoDbContextExtensions { b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "UserDelegations"; }); + + builder.Entity(b => + { + b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "Sessions"; + }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs index 35c81b25bb..8537bf630f 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs @@ -21,6 +21,7 @@ public class AbpIdentityMongoDbModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs index 39bcc23b50..7481afe5ac 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs @@ -20,4 +20,6 @@ public interface IAbpIdentityMongoDbContext : IAbpMongoDbContext IMongoCollection LinkUsers { get; } IMongoCollection UserDelegations { get; } + + IMongoCollection Sessions { get; } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs new file mode 100644 index 0000000000..9f873165a0 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; + +namespace Volo.Abp.Identity.MongoDB; + +public class MongoIdentitySessionRepository : MongoDbRepository, IIdentitySessionRepository +{ + public MongoIdentitySessionRepository(IMongoDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + + } +}