From 9a1ab4b3127902fea5c621300096835465536f7d Mon Sep 17 00:00:00 2001 From: iatsuta Date: Thu, 19 Feb 2026 14:02:26 +0100 Subject: [PATCH] upd-di-setup --- .../Management/ManagedPermission.cs | 8 +- .../GeneralPermissionSettings.cs | 128 +++++++- .../SecuritySystemSettingsExtensions.cs | 146 ++------- src/SecuritySystem.Testing/TestPermission.cs | 4 +- .../SecuritySystemSettingsExtensions.cs | 49 +-- .../VirtualBindingInfoRootSettingsBuilder.cs | 57 +++- .../SecuritySystemSettings.cs | 284 +++++++++++++----- .../ServiceCollectionExtensions.cs | 157 +--------- .../PermissionDelegatedFromTests.cs | 1 - src/__SolutionItems/CommonAssemblyInfo.cs | 2 +- 10 files changed, 422 insertions(+), 414 deletions(-) diff --git a/src/SecuritySystem.Abstractions/ExternalSystem/Management/ManagedPermission.cs b/src/SecuritySystem.Abstractions/ExternalSystem/Management/ManagedPermission.cs index 37dad88..88eda4b 100644 --- a/src/SecuritySystem.Abstractions/ExternalSystem/Management/ManagedPermission.cs +++ b/src/SecuritySystem.Abstractions/ExternalSystem/Management/ManagedPermission.cs @@ -4,14 +4,14 @@ namespace SecuritySystem.ExternalSystem.Management; public record ManagedPermission { - public required SecurityIdentity Identity { get; init; } + public required SecurityRole SecurityRole { get; init; } + + public SecurityIdentity Identity { get; init; } = SecurityIdentity.Default; public bool ForceApplyIdentity { get; init; } public bool IsVirtual { get; init; } - public required SecurityRole SecurityRole { get; init; } - public PermissionPeriod Period { get; init; } = PermissionPeriod.Eternity; public string Comment { get; init; } = ""; @@ -23,7 +23,7 @@ public record ManagedPermission public ImmutableDictionary ExtendedData { get; init; } = []; - public static implicit operator ManagedPermission(SecurityRole securityRole) => new() { SecurityRole = securityRole, Identity = SecurityIdentity.Default }; + public static implicit operator ManagedPermission(SecurityRole securityRole) => new() { SecurityRole = securityRole }; public ManagedPermission WithExtendedData(string key, object value) { diff --git a/src/SecuritySystem.GeneralPermission/DependencyInjection/GeneralPermissionSettings.cs b/src/SecuritySystem.GeneralPermission/DependencyInjection/GeneralPermissionSettings.cs index dc65a5f..3fcf559 100644 --- a/src/SecuritySystem.GeneralPermission/DependencyInjection/GeneralPermissionSettings.cs +++ b/src/SecuritySystem.GeneralPermission/DependencyInjection/GeneralPermissionSettings.cs @@ -1,14 +1,25 @@ using System.Linq.Expressions; using CommonFramework; +using CommonFramework.DependencyInjection; + +using Microsoft.Extensions.DependencyInjection; + +using SecuritySystem.DependencyInjection; +using SecuritySystem.ExternalSystem.Management; using SecuritySystem.GeneralPermission.Validation; +using SecuritySystem.GeneralPermission.Initialize; +using SecuritySystem.GeneralPermission.Validation.Permission; +using SecuritySystem.GeneralPermission.Validation.PermissionRestriction; +using SecuritySystem.GeneralPermission.Validation.Principal; +using SecuritySystem.Services; namespace SecuritySystem.GeneralPermission.DependencyInjection; -public class GeneralPermissionSettings : - IGeneralPermissionSettings +public class GeneralPermissionSettings : IGeneralPermissionSettings where TPermission : class where TSecurityRole : notnull + where TPrincipal : class { private PropertyAccessors? startDateAccessors; @@ -22,12 +33,63 @@ public class GeneralPermissionSettings(TPermissionBindingInfo bindingInfo) + public void Initialize(ISecuritySystemSettings securitySystemSettings, + PropertyAccessors principalAccessors, + PropertyAccessors securityRoleAccessors, + PropertyAccessors permissionAccessors, + PropertyAccessors securityContextTypeAccessors, + PropertyAccessors securityContextObjectIdAccessors) + { + this.RegisterGeneralServices(securitySystemSettings); + + var bindingInfo = new PermissionBindingInfo + { + Principal = principalAccessors, + }.Pipe(this.ApplyOptionalPaths); + + var generalBindingInfo = new GeneralPermissionBindingInfo + { + SecurityRole = securityRoleAccessors, + }.Pipe(this.ApplyGeneralOptionalPaths); + + var restrictionBindingInfo = + new GeneralPermissionRestrictionBindingInfo + { + Permission = permissionAccessors, + SecurityContextType = securityContextTypeAccessors, + SecurityContextObjectId = securityContextObjectIdAccessors + }; + + securitySystemSettings + .AddPermissionSystem(sp => new GeneralPermissionSystemFactory(sp, bindingInfo)) + .AddExtensions(services => + { + services + .AddSingleton(bindingInfo) + .AddSingleton(generalBindingInfo) + .AddSingleton(restrictionBindingInfo) + + .AddScoped(typeof(IPrincipalSourceService), typeof(GeneralPrincipalSourceService)); + + if (this.permissionEqualityComparerType != null) + { + services.AddScoped(typeof(IPermissionEqualityComparer), this.permissionEqualityComparerType); + } + + if (this.permissionManagementServiceType != null) + { + services.AddScoped(typeof(IPermissionManagementService), + this.permissionManagementServiceType); + } + }); + } + + private TPermissionBindingInfo ApplyOptionalPaths(TPermissionBindingInfo bindingInfo) where TPermissionBindingInfo : PermissionBindingInfo { return bindingInfo @@ -38,7 +100,7 @@ public TPermissionBindingInfo ApplyOptionalPaths(TPermis .PipeMaybe(this.isReadonly, (b, v) => b with { IsReadonly = v }); } - public TGeneralPermissionBindingInfo ApplyGeneralOptionalPaths(TGeneralPermissionBindingInfo bindingInfo) + private TGeneralPermissionBindingInfo ApplyGeneralOptionalPaths(TGeneralPermissionBindingInfo bindingInfo) where TGeneralPermissionBindingInfo : GeneralPermissionBindingInfo { return bindingInfo @@ -98,7 +160,7 @@ public IGeneralPermissionSettings SetPermissionEqualityComparer() where TComparer : IPermissionEqualityComparer { - this.PermissionEqualityComparerType = typeof(TComparer); + this.permissionEqualityComparerType = typeof(TComparer); return this; } @@ -107,8 +169,58 @@ public IGeneralPermissionSettings() where TPermissionManagementService : IPermissionManagementService { - this.PermissionManagementServiceType = typeof(TPermissionManagementService); + this.permissionManagementServiceType = typeof(TPermissionManagementService); return this; } + + private ISecuritySystemSettings RegisterGeneralServices(ISecuritySystemSettings settings) + { + return settings + .AddExtensions(services => + { + if (services.AlreadyInitialized()) + { + return; + } + + services + .AddSingleton(typeof(IPermissionRestrictionTypeFilterFactory<>), typeof(PermissionRestrictionTypeFilterFactory<>)) + .AddScoped(typeof(IPermissionRestrictionFilterFactory<>), typeof(PermissionRestrictionFilterFactory<>)) + .AddScoped(typeof(IRawPermissionConverter<>), typeof(RawPermissionConverter<>)) + .AddSingleton(typeof(IPermissionSecurityRoleFilterFactory<>), typeof(PermissionSecurityRoleFilterFactory<>)) + .AddSingleton(typeof(IPermissionSecurityRoleIdentsFilterFactory<>), typeof(PermissionSecurityRoleIdentsFilterFactory<>)) + .AddScoped(typeof(IPermissionFilterFactory<>), typeof(PermissionFilterFactory<>)) + .AddScoped() + .AddScoped(typeof(ISecurityRoleInitializer<>), typeof(SecurityRoleInitializer<>)) + .AddScoped() + .AddScoped(typeof(ISecurityContextInitializer<>), typeof(SecurityContextInitializer<>)) + .AddScoped(typeof(IManagedPrincipalConverter<>), typeof(ManagedPrincipalConverter<>)) + .AddScoped(typeof(IDisplayPermissionService<,>), typeof(DisplayPermissionService<,>)) + + .AddSingleton(typeof(IPermissionEqualityComparer<,>), typeof(PermissionEqualityComparer<,>)) + + .AddKeyedScoped(typeof(IPrincipalValidator<,,>), "Root", typeof(PrincipalRootValidator<,,>)) + .AddScoped(typeof(IPrincipalValidator<,,>), typeof(PrincipalUniquePermissionValidator<,,>)) + .AddKeyedScoped(typeof(IPermissionValidator<,>), "Root", typeof(PermissionRootValidator<,>)) + .AddSingleton(typeof(IPermissionValidator<,>), typeof(PermissionRequiredContextValidator<,>)) + .AddScoped(typeof(IPermissionValidator<,>), typeof(PermissionDelegationValidator<,>)) + .AddKeyedScoped(typeof(IPermissionRestrictionValidator<>), "Root", typeof(PermissionRestrictionRootValidator<>)) + .AddSingleton(typeof(IPermissionRestrictionValidator<>), typeof(AllowedTypePermissionRestrictionValidator<>)) + .AddScoped(typeof(IPermissionRestrictionValidator<>), typeof(ExistsPermissionRestrictionValidator<>)) + .AddScoped(typeof(IPermissionRestrictionValidator<>), typeof(AllowedFilterPermissionRestrictionValidator<>)) + .AddScoped(typeof(IPermissionLoader<,>), typeof(PermissionLoader<,>)) + .AddScoped(typeof(IPermissionRestrictionLoader<,>), typeof(PermissionRestrictionLoader<,>)) + .AddScoped(typeof(IRawPermissionRestrictionLoader<>), typeof(RawPermissionRestrictionLoader<>)) + .AddSingleton(typeof(IPermissionRestrictionRawConverter<>), typeof(PermissionRestrictionRawConverter<>)) + .AddSingleton(typeof(IPermissionSecurityRoleResolver<>), typeof(PermissionSecurityRoleResolver<>)) + .AddSingleton(typeof(IPermissionRestrictionSecurityContextTypeResolver<>), typeof(PermissionRestrictionSecurityContextTypeResolver<>)) + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddScoped(typeof(IPermissionManagementService<,,>), typeof(PermissionManagementService<,,>)); + }) + + .SetPrincipalManagementService(); + } } \ No newline at end of file diff --git a/src/SecuritySystem.GeneralPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs b/src/SecuritySystem.GeneralPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs index 9bd12d2..99f9481 100644 --- a/src/SecuritySystem.GeneralPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs +++ b/src/SecuritySystem.GeneralPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs @@ -1,17 +1,5 @@ using CommonFramework; -using CommonFramework.DependencyInjection; - -using Microsoft.Extensions.DependencyInjection; - using SecuritySystem.DependencyInjection; -using SecuritySystem.ExternalSystem.Management; -using SecuritySystem.GeneralPermission.Initialize; -using SecuritySystem.GeneralPermission.Validation; -using SecuritySystem.GeneralPermission.Validation.Permission; -using SecuritySystem.GeneralPermission.Validation.PermissionRestriction; -using SecuritySystem.GeneralPermission.Validation.Principal; -using SecuritySystem.Services; - using System.Linq.Expressions; namespace SecuritySystem.GeneralPermission.DependencyInjection; @@ -20,38 +8,31 @@ public static class SecuritySystemSettingsExtensions { extension(ISecuritySystemSettings securitySystemSettings) { - public ISecuritySystemSettings AddGeneralPermission( - PermissionBindingInfo bindingInfo, - GeneralPermissionBindingInfo generalBindingInfo, - GeneralPermissionRestrictionBindingInfo restrictionBindingInfo, - Type? permissionEqualityComparerType, - Type? permissionManagementServiceType) + public ISecuritySystemSettings AddGeneralPermission( + PropertyAccessors principalAccessors, + PropertyAccessors securityRoleAccessors, + PropertyAccessors permissionAccessors, + PropertyAccessors securityContextTypeAccessors, + PropertyAccessors securityContextObjectIdAccessors, + Action>? setupAction = null) + where TPrincipal : class + where TPermission : class + where TSecurityRole : class + where TPermissionRestriction : class + where TSecurityContextType : class + where TSecurityContextObjectIdent : notnull { - return securitySystemSettings - .AddGeneralServices() - - .AddPermissionSystem(sp => new GeneralPermissionSystemFactory(sp, bindingInfo)) - .AddExtensions(services => services + var settings = new GeneralPermissionSettings(); - .AddSingleton(bindingInfo) - .AddSingleton(generalBindingInfo) - .AddSingleton(restrictionBindingInfo) - - .PipeMaybe(permissionEqualityComparerType, (sc, v) => sc - .AddScoped( - typeof(IPermissionEqualityComparer<,>) - .MakeGenericType(restrictionBindingInfo.PermissionType, restrictionBindingInfo.PermissionRestrictionType), v)) + setupAction?.Invoke(settings); - .PipeMaybe(permissionManagementServiceType, (sc, v) => sc - .AddScoped( - typeof(IPermissionManagementService<,,>) - .MakeGenericType(bindingInfo.PrincipalType, restrictionBindingInfo.PermissionType, restrictionBindingInfo.PermissionRestrictionType), v)) + settings.Initialize(securitySystemSettings, principalAccessors, securityRoleAccessors, permissionAccessors, securityContextTypeAccessors, + securityContextObjectIdAccessors); - .AddScoped(typeof(IPrincipalSourceService), typeof(GeneralPrincipalSourceService<>).MakeGenericType(bindingInfo.PrincipalType))); + return securitySystemSettings; } - - public ISecuritySystemSettings AddGeneralPermission( Expression> principalPath, @@ -65,86 +46,13 @@ public ISecuritySystemSettings AddGeneralPermission( where TSecurityRole : class where TPermissionRestriction : class where TSecurityContextType : class - where TSecurityContextObjectIdent : notnull - { - var settings = new GeneralPermissionSettings(); - - setupAction?.Invoke(settings); - - var bindingInfo = new PermissionBindingInfo - { - Principal = principalPath.ToPropertyAccessors(), - }.Pipe(settings.ApplyOptionalPaths); - - var generalBindingInfo = new GeneralPermissionBindingInfo - { - SecurityRole = securityRolePath.ToPropertyAccessors(), - }.Pipe(settings.ApplyGeneralOptionalPaths); - - var restrictionBindingInfo = - new GeneralPermissionRestrictionBindingInfo - { - Permission = permissionPath.ToPropertyAccessors(), - SecurityContextType = securityContextTypePath.ToPropertyAccessors(), - SecurityContextObjectId = securityContextObjectIdPath.ToPropertyAccessors() - }; - - return securitySystemSettings.AddGeneralPermission( - bindingInfo, - generalBindingInfo, - restrictionBindingInfo, - settings.PermissionEqualityComparerType, - settings.PermissionManagementServiceType); - } - - private ISecuritySystemSettings AddGeneralServices() - { - return securitySystemSettings - .AddExtensions(services => - { - if (services.AlreadyInitialized()) - { - return; - } - - services - .AddSingleton(typeof(IPermissionRestrictionTypeFilterFactory<>), typeof(PermissionRestrictionTypeFilterFactory<>)) - .AddScoped(typeof(IPermissionRestrictionFilterFactory<>), typeof(PermissionRestrictionFilterFactory<>)) - .AddScoped(typeof(IRawPermissionConverter<>), typeof(RawPermissionConverter<>)) - .AddSingleton(typeof(IPermissionSecurityRoleFilterFactory<>), typeof(PermissionSecurityRoleFilterFactory<>)) - .AddSingleton(typeof(IPermissionSecurityRoleIdentsFilterFactory<>), typeof(PermissionSecurityRoleIdentsFilterFactory<>)) - .AddScoped(typeof(IPermissionFilterFactory<>), typeof(PermissionFilterFactory<>)) - .AddScoped() - .AddScoped(typeof(ISecurityRoleInitializer<>), typeof(SecurityRoleInitializer<>)) - .AddScoped() - .AddScoped(typeof(ISecurityContextInitializer<>), typeof(SecurityContextInitializer<>)) - .AddScoped(typeof(IManagedPrincipalConverter<>), typeof(ManagedPrincipalConverter<>)) - .AddScoped(typeof(IDisplayPermissionService<,>), typeof(DisplayPermissionService<,>)) - - .AddSingleton(typeof(IPermissionEqualityComparer<,>), typeof(PermissionEqualityComparer<,>)) - - .AddKeyedScoped(typeof(IPrincipalValidator<,,>), "Root", typeof(PrincipalRootValidator<,,>)) - .AddScoped(typeof(IPrincipalValidator<,,>), typeof(PrincipalUniquePermissionValidator<,,>)) - .AddKeyedScoped(typeof(IPermissionValidator<,>), "Root", typeof(PermissionRootValidator<,>)) - .AddSingleton(typeof(IPermissionValidator<,>), typeof(PermissionRequiredContextValidator<,>)) - .AddScoped(typeof(IPermissionValidator<,>), typeof(PermissionDelegationValidator<,>)) - .AddKeyedScoped(typeof(IPermissionRestrictionValidator<>), "Root", typeof(PermissionRestrictionRootValidator<>)) - .AddSingleton(typeof(IPermissionRestrictionValidator<>), typeof(AllowedTypePermissionRestrictionValidator<>)) - .AddScoped(typeof(IPermissionRestrictionValidator<>), typeof(ExistsPermissionRestrictionValidator<>)) - .AddScoped(typeof(IPermissionRestrictionValidator<>), typeof(AllowedFilterPermissionRestrictionValidator<>)) - .AddScoped(typeof(IPermissionLoader<,>), typeof(PermissionLoader<,>)) - .AddScoped(typeof(IPermissionRestrictionLoader<,>), typeof(PermissionRestrictionLoader<,>)) - .AddScoped(typeof(IRawPermissionRestrictionLoader<>), typeof(RawPermissionRestrictionLoader<>)) - .AddSingleton(typeof(IPermissionRestrictionRawConverter<>), typeof(PermissionRestrictionRawConverter<>)) - .AddSingleton(typeof(IPermissionSecurityRoleResolver<>), typeof(PermissionSecurityRoleResolver<>)) - .AddSingleton(typeof(IPermissionRestrictionSecurityContextTypeResolver<>), typeof(PermissionRestrictionSecurityContextTypeResolver<>)) - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddScoped(typeof(IPermissionManagementService<,,>), typeof(PermissionManagementService<,,>)); - }) - - .SetPrincipalManagementService(); - } + where TSecurityContextObjectIdent : notnull => + securitySystemSettings.AddGeneralPermission( + principalPath.ToPropertyAccessors(), + securityRolePath.ToPropertyAccessors(), + permissionPath.ToPropertyAccessors(), + securityContextTypePath.ToPropertyAccessors(), + securityContextObjectIdPath.ToPropertyAccessors(), + setupAction); } } \ No newline at end of file diff --git a/src/SecuritySystem.Testing/TestPermission.cs b/src/SecuritySystem.Testing/TestPermission.cs index 8152ab5..9eb8512 100644 --- a/src/SecuritySystem.Testing/TestPermission.cs +++ b/src/SecuritySystem.Testing/TestPermission.cs @@ -80,7 +80,7 @@ public void SetMany(TypedSecurityIdentity[] va } } - public ManagedPermission ToManagedPermissionData() => new() + public ManagedPermission ToManagedPermission() => new() { Identity = this.Identity, ForceApplyIdentity = true, @@ -94,5 +94,5 @@ public void SetMany(TypedSecurityIdentity[] va ExtendedData = this.ExtendedData.ToImmutableDictionary() }; - public static implicit operator ManagedPermission(TestPermission testPermissionBuilder) => testPermissionBuilder.ToManagedPermissionData(); + public static implicit operator ManagedPermission(TestPermission testPermissionBuilder) => testPermissionBuilder.ToManagedPermission(); } \ No newline at end of file diff --git a/src/SecuritySystem.VirtualPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs b/src/SecuritySystem.VirtualPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs index c346e0f..d8c9d06 100644 --- a/src/SecuritySystem.VirtualPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs +++ b/src/SecuritySystem.VirtualPermission/DependencyInjection/SecuritySystemSettingsExtensions.cs @@ -1,12 +1,6 @@ using CommonFramework; -using CommonFramework.DependencyInjection; - -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using SecuritySystem.DependencyInjection; -using SecuritySystem.ExternalSystem; -using SecuritySystem.ExternalSystem.Management; using System.Linq.Expressions; @@ -16,56 +10,27 @@ public static class SecuritySystemSettingsExtensions { extension(ISecuritySystemSettings securitySystemSettings) { - public ISecuritySystemSettings AddVirtualPermission( - PermissionBindingInfo bindingInfo, - IReadOnlyList virtualBindingInfoList) - { - foreach (var virtualBindingInfo in virtualBindingInfoList) - { - securitySystemSettings.AddPermissionSystem(serviceProxyFactory => - serviceProxyFactory.Create(virtualBindingInfo)); - } - - return securitySystemSettings.AddExtensions(services => - { - services.AddSingleton(bindingInfo); - services.TryAddSingleton(); - - var serviceType = typeof(VirtualPrincipalSourceService<>).MakeGenericType(bindingInfo.PermissionType); - - foreach (var virtualBindingInfo in virtualBindingInfoList) - { - services.AddScopedFrom(factory => - factory.Create(serviceType, virtualBindingInfo)); - } - }); - } - public ISecuritySystemSettings AddVirtualPermission( PropertyAccessors principalAccessors, - Action> initAction) + Action> setupAction) where TPrincipal : class where TPermission : class { - var bindingInfo = new PermissionBindingInfo { IsReadonly = true, Principal = principalAccessors }; + var builder = new VirtualBindingInfoRootSettingsBuilder(); - var builder = new VirtualBindingInfoRootSettingsBuilder(); + setupAction.Invoke(builder); - initAction.Invoke(builder); + builder.Initialize(securitySystemSettings, principalAccessors); - return securitySystemSettings.AddVirtualPermission(bindingInfo, builder.VirtualPermissionBindingInfoList.ToArray()); + return securitySystemSettings; } public ISecuritySystemSettings AddVirtualPermission( Expression> principalPath, - Action> initAction) + Action> setupAction) where TPrincipal : class where TPermission : class => securitySystemSettings.AddVirtualPermission( - new PropertyAccessors( - principalPath, - principalPath.Compile(), - (_, __) => throw new NotImplementedException("ReadOnly")), - initAction); + principalPath.ToPropertyAccessors(), setupAction); } } \ No newline at end of file diff --git a/src/SecuritySystem.VirtualPermission/DependencyInjection/VirtualBindingInfoRootSettingsBuilder.cs b/src/SecuritySystem.VirtualPermission/DependencyInjection/VirtualBindingInfoRootSettingsBuilder.cs index 245f302..f4ae17a 100644 --- a/src/SecuritySystem.VirtualPermission/DependencyInjection/VirtualBindingInfoRootSettingsBuilder.cs +++ b/src/SecuritySystem.VirtualPermission/DependencyInjection/VirtualBindingInfoRootSettingsBuilder.cs @@ -1,22 +1,30 @@ -using CommonFramework; +using System.Linq.Expressions; -using System.Linq.Expressions; +using CommonFramework; +using CommonFramework.DependencyInjection; + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +using SecuritySystem.DependencyInjection; +using SecuritySystem.ExternalSystem; +using SecuritySystem.ExternalSystem.Management; namespace SecuritySystem.VirtualPermission.DependencyInjection; -public class VirtualBindingInfoRootSettingsBuilder : IVirtualBindingInfoRootSettingsBuilder - where TPermission : notnull +public class VirtualBindingInfoRootSettingsBuilder : IVirtualBindingInfoRootSettingsBuilder + where TPermission : class { - public readonly List> VirtualPermissionBindingInfoList = new(); + private readonly List> virtualPermissionBindingInfoList = []; - public readonly List, PermissionBindingInfo>> PermissionBindingInit = new(); + private readonly List, PermissionBindingInfo>> permissionBindingInit = []; public IVirtualBindingInfoRootSettingsBuilder SetPeriod( PropertyAccessors? startDatePropertyAccessor, PropertyAccessors? endDatePropertyAccessor) { - this.PermissionBindingInit.Add(permissionBinding => permissionBinding with { PermissionStartDate = startDatePropertyAccessor }); - this.PermissionBindingInit.Add(permissionBinding => permissionBinding with { PermissionEndDate = endDatePropertyAccessor }); + this.permissionBindingInit.Add(permissionBinding => permissionBinding with { PermissionStartDate = startDatePropertyAccessor }); + this.permissionBindingInit.Add(permissionBinding => permissionBinding with { PermissionEndDate = endDatePropertyAccessor }); return this; } @@ -30,14 +38,15 @@ public IVirtualBindingInfoRootSettingsBuilder SetPeriod( public IVirtualBindingInfoRootSettingsBuilder SetComment(Expression> commentPath) { - this.PermissionBindingInit.Add(permissionBinding => permissionBinding with { PermissionComment = commentPath.ToPropertyAccessors() }); + this.permissionBindingInit.Add(permissionBinding => permissionBinding with { PermissionComment = commentPath.ToPropertyAccessors() }); return this; } + public IVirtualBindingInfoRootSettingsBuilder SetPermissionDelegation( Expression> newDelegatedFromPath) { - this.PermissionBindingInit.Add(permissionBinding => permissionBinding with { DelegatedFrom = newDelegatedFromPath.ToPropertyAccessors() }); + this.permissionBindingInit.Add(permissionBinding => permissionBinding with { DelegatedFrom = newDelegatedFromPath.ToPropertyAccessors() }); return this; } @@ -51,8 +60,34 @@ public IVirtualBindingInfoRootSettingsBuilder ForRole(SecurityRole var virtualBindingInfo = innerBuilder.Init(new VirtualPermissionBindingInfo { SecurityRole = securityRole }); - this.VirtualPermissionBindingInfoList.Add(virtualBindingInfo); + this.virtualPermissionBindingInfoList.Add(virtualBindingInfo); return this; } + + public void Initialize(ISecuritySystemSettings securitySystemSettings, PropertyAccessors principalAccessors) + { + var baseBindingInfo = new PermissionBindingInfo { IsReadonly = true, Principal = principalAccessors }; + + var bindingInfo = permissionBindingInit.Aggregate(baseBindingInfo, (state, f) => f(state)); + + foreach (var virtualBindingInfo in this.virtualPermissionBindingInfoList) + { + securitySystemSettings.AddPermissionSystem(serviceProxyFactory => + serviceProxyFactory.Create(virtualBindingInfo)); + } + + securitySystemSettings.AddExtensions(services => + { + services.AddSingleton(bindingInfo); + + services.TryAddSingleton(); + + foreach (var virtualBindingInfo in this.virtualPermissionBindingInfoList) + { + services.AddScopedFrom(factory => + factory.Create>(virtualBindingInfo)); + } + }); + } } \ No newline at end of file diff --git a/src/SecuritySystem/DependencyInjection/SecuritySystemSettings.cs b/src/SecuritySystem/DependencyInjection/SecuritySystemSettings.cs index b2b16e4..65b0fb8 100644 --- a/src/SecuritySystem/DependencyInjection/SecuritySystemSettings.cs +++ b/src/SecuritySystem/DependencyInjection/SecuritySystemSettings.cs @@ -1,23 +1,33 @@ using CommonFramework; using CommonFramework.DependencyInjection; +using CommonFramework.ExpressionEvaluate; using CommonFramework.GenericRepository; using CommonFramework.IdentitySource.DependencyInjection; using CommonFramework.RelativePath; using CommonFramework.VisualIdentitySource.DependencyInjection; - using HierarchicalExpand.DependencyInjection; - using Microsoft.Extensions.DependencyInjection; using SecuritySystem.AccessDenied; +using SecuritySystem.AvailableSecurity; +using SecuritySystem.Builders._Factory; +using SecuritySystem.Builders.AccessorsBuilder; +using SecuritySystem.Credential; using SecuritySystem.DependencyInjection.Domain; +using SecuritySystem.DomainServices; +using SecuritySystem.Expanders; using SecuritySystem.ExternalSystem; using SecuritySystem.ExternalSystem.ApplicationSecurity; using SecuritySystem.ExternalSystem.Management; +using SecuritySystem.ExternalSystem.SecurityContextStorage; +using SecuritySystem.PermissionOptimization; +using SecuritySystem.Providers; using SecuritySystem.SecurityAccessor; using SecuritySystem.SecurityRuleInfo; using SecuritySystem.Services; using SecuritySystem.UserSource; +using System.Globalization; using System.Reflection; +using SecuritySystem.Builders.MaterializedBuilder; namespace SecuritySystem.DependencyInjection; @@ -50,14 +60,14 @@ public class SecuritySystemSettings : ISecuritySystemSettings private Type principalManagementServiceType = typeof(FakePrincipalManagementService); - public readonly List> IdentitySetupActions = new(); + private readonly List> identitySetupActions = []; - public readonly List> VisualIdentitySetupActions = new(); + private readonly List> visualIdentitySetupActions = []; - public readonly List> HierarchicalSetupActions = new(); + private readonly List> hierarchicalSetupActions = []; - public bool InitializeDefaultRoles { get; set; } = true; + public bool InitializeDefaultRoles { get; set; } = true; public bool AutoAddSelfRelativePath { get; set; } = true; @@ -68,29 +78,30 @@ public ISecuritySystemSettings SetSecurityAdministratorRule(DomainSecurityRule.R return this; } - public ISecuritySystemSettings AddSecurityContext(TypedSecurityIdentity identity, Action>? setup = null) + public ISecuritySystemSettings AddSecurityContext(TypedSecurityIdentity identity, + Action>? setup = null) where TSecurityContext : class, ISecurityContext { - var builder = new SecurityContextInfoBuilder(identity); + var builder = new SecurityContextInfoBuilder(identity); - setup?.Invoke(builder); + setup?.Invoke(builder); - if (builder.IdentitySetupAction != null) - { - this.IdentitySetupActions.Add(builder.IdentitySetupAction); - } + if (builder.IdentitySetupAction != null) + { + this.identitySetupActions.Add(builder.IdentitySetupAction); + } - if (builder.VisualIdentitySetupAction != null) - { - this.VisualIdentitySetupActions.Add(builder.VisualIdentitySetupAction); - } + if (builder.VisualIdentitySetupAction != null) + { + this.visualIdentitySetupActions.Add(builder.VisualIdentitySetupAction); + } - if (builder.HierarchicalSetupAction != null) - { - this.HierarchicalSetupActions.Add(builder.HierarchicalSetupAction); - } + if (builder.HierarchicalSetupAction != null) + { + this.hierarchicalSetupActions.Add(builder.HierarchicalSetupAction); + } - this.registerActions.Add(sc => builder.Register(sc)); + this.registerActions.Add(sc => builder.Register(sc)); return this; } @@ -189,51 +200,51 @@ public ISecuritySystemSettings SetAccessDeniedExceptionService(Action>? setupUserSource) - where TUser : class + where TUser : class { - if (!userSourceTypes.Add(typeof(TUser))) - { - throw new InvalidOperationException($"{nameof(UserSource<>)} for {typeof(TUser).Name} already initialized"); - } + if (!userSourceTypes.Add(typeof(TUser))) + { + throw new InvalidOperationException($"{nameof(UserSource<>)} for {typeof(TUser).Name} already initialized"); + } - var userSourceBuilder = new UserSourceBuilder(); + var userSourceBuilder = new UserSourceBuilder(); - setupUserSource?.Invoke(userSourceBuilder); + setupUserSource?.Invoke(userSourceBuilder); - if (userSourceBuilder.VisualIdentitySetupAction != null) - { - this.VisualIdentitySetupActions.Add(userSourceBuilder.VisualIdentitySetupAction); - } + if (userSourceBuilder.VisualIdentitySetupAction != null) + { + this.visualIdentitySetupActions.Add(userSourceBuilder.VisualIdentitySetupAction); + } - this.registerActions.Add(sc => - { - var info = new UserSourceInfo(userSourceBuilder.FilterPath); + this.registerActions.Add(sc => + { + var info = new UserSourceInfo(userSourceBuilder.FilterPath); - sc.AddSingleton(info); - sc.AddSingleton(info); + sc.AddSingleton(info); + sc.AddSingleton(info); sc.AddScopedFrom>(); sc.AddScoped(typeof(IMissedUserService), userSourceBuilder.MissedUserServiceType); - }); - - if (userSourceBuilder.RunAsPath != null) - { - if (this.registerRunAsManagerAction == null) - { - this.registerRunAsManagerAction = sc => - { - sc.AddSingleton(new UserSourceRunAsInfo(userSourceBuilder.RunAsPath)); - sc.AddScoped>(); + }); + + if (userSourceBuilder.RunAsPath != null) + { + if (this.registerRunAsManagerAction == null) + { + this.registerRunAsManagerAction = sc => + { + sc.AddSingleton(new UserSourceRunAsInfo(userSourceBuilder.RunAsPath)); + sc.AddScoped>(); }; - } - else - { - throw new InvalidOperationException("RunAs already initialized"); - } - } - - return this; + } + else + { + throw new InvalidOperationException("RunAs already initialized"); + } + } + + return this; } public ISecuritySystemSettings SetSecurityAccessorInfinityStorage() @@ -270,7 +281,8 @@ public ISecuritySystemSettings SetClientDomainModeSecurityRuleSource() where TClientSecurityRuleInfoSource : class, IClientSecurityRuleInfoSource { - this.registerActions.Add(sc => sc.AddKeyedSingleton(RootClientSecurityRuleInfoSource.ElementKey)); + this.registerActions.Add(sc => + sc.AddKeyedSingleton(RootClientSecurityRuleInfoSource.ElementKey)); return this; } @@ -317,13 +329,32 @@ public ISecuritySystemSettings SetGenericRepository() return this; } + private void AddSecurityRole(IServiceCollection serviceCollection, FullSecurityRole fullSecurityRole) + { + if (this.InitializeDefaultRoles) + { + serviceCollection.AddSingleton(new PreInitializerFullSecurityRole(fullSecurityRole)); + } + else + { + serviceCollection.AddSingleton(fullSecurityRole); + } + } + public void Initialize(IServiceCollection services) { + this.RegisterGeneralServices(services); + + services.AddIdentitySource(s => this.identitySetupActions.Foreach(action => action(s))); + services.AddVisualIdentitySource(s => this.visualIdentitySetupActions.ForEach(action => action(s))); + services.AddHierarchicalExpand(s => this.hierarchicalSetupActions.ForEach(action => action(s))); + (this.registerQueryableSourceAction ?? throw new InvalidOperationException("QueryableSource must be initialized")).Invoke(services); (this.registerGenericRepositoryAction ?? throw new InvalidOperationException("GenericRepository must be initialized")).Invoke(services); - (this.registerRawUserAuthenticationServiceAction ?? throw new InvalidOperationException("RawUserAuthenticationService must be initialized")).Invoke(services); + (this.registerRawUserAuthenticationServiceAction ?? throw new InvalidOperationException("RawUserAuthenticationService must be initialized")) + .Invoke(services); services.AddSingleton(new SecurityAdministratorRuleInfo(this.securityAdministratorRule)); @@ -331,8 +362,8 @@ public void Initialize(IServiceCollection services) if (this.registerRunAsManagerAction != null) { - this.registerRunAsManagerAction(services); - } + this.registerRunAsManagerAction(services); + } if (this.InitializeDefaultRoles) { @@ -363,15 +394,128 @@ public void Initialize(IServiceCollection services) } } - private void AddSecurityRole(IServiceCollection serviceCollection, FullSecurityRole fullSecurityRole) + + + + private IServiceCollection RegisterGeneralServices(IServiceCollection services) { - if (this.InitializeDefaultRoles) - { - serviceCollection.AddSingleton(new PreInitializerFullSecurityRole(fullSecurityRole)); - } - else - { - serviceCollection.AddSingleton(fullSecurityRole); - } + return services + + .AddScoped() + + .AddSingleton(typeof(IManagedPrincipalHeaderConverterFactory<>), typeof(ManagedPrincipalHeaderConverterFactory<>)) + .AddSingleton(typeof(IManagedPrincipalHeaderConverter<>), typeof(ManagedPrincipalHeaderConverter<>)) + .AddScoped(typeof(IPrincipalDomainService<>), typeof(PrincipalDomainService<>)) + .AddScoped(typeof(IAvailablePermissionFilterFactory<>), typeof(AvailablePermissionFilterFactory<>)) + .AddScoped(typeof(IAvailablePermissionSource<>), typeof(AvailablePermissionSource<>)) + .AddScoped(typeof(IAvailablePrincipalSource<>), typeof(AvailablePrincipalSource<>)) + .AddSingleton() + + .AddSingleton(typeof(ISecurityIdentityExtractor<>), typeof(SecurityIdentityExtractor<>)) + .AddSingleton(typeof(ISecurityIdentityConverter<>), typeof(SecurityIdentityConverter<>)) + .AddSingleton() + + .AddSingleton() + + .AddSingleton(new FormatProviderSource(CultureInfo.CurrentCulture)) + .AddSingleton(typeof(IIdentsParser<>), typeof(IdentsParser<>)) + .AddSingleton() + + .AddScoped(typeof(ISecurityRepository<>), typeof(SecurityRepository<>)) + .AddSingleton(typeof(ISecurityIdentityFilterFactory<>), typeof(SecurityIdentityFilterFactory<>)) + + .AddSingleton(_ => new ExpressionEvaluatorStorage(LambdaCompileMode.All)) + + .AddSingleton(typeof(IDefaultUserConverter<>), typeof(DefaultUserConverter<>)) + .AddScoped(typeof(ICurrentUserSource<>), typeof(CurrentUserSource<>)) + .AddScoped(typeof(IUserSource<>), typeof(UserSource<>)) + .AddScoped(typeof(IUserQueryableSource<>), typeof(UserQueryableSource<>)) + .AddScoped(typeof(IUserNameResolver<>), typeof(UserNameResolver<>)) + .AddScoped(typeof(IUserFilterFactory<>), typeof(UserFilterFactory<>)) + .AddKeyedScoped(typeof(ICurrentUserSource<>), nameof(SecurityRuleCredential.CurrentUserWithoutRunAsCredential), typeof(RawCurrentUserSource<>)) + .AddSingleton() + + .AddSingleton(typeof(IUserCredentialMatcher<>), typeof(UserCredentialMatcher<>)) + + .AddScoped() + .AddScoped(typeof(LocalStorage<,>)) + + .AddScoped() + + .AddSingleton() + .AddSingleton() + .AddKeyedSingleton(RootClientSecurityRuleInfoSource.ElementKey) + .AddSingleton() + .AddSingleton() + .AddSingleton() + + .AddSingleton() + + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddScoped() + .AddSingleton() + .AddSingleton() + .AddSingleton() + + .AddScoped(typeof(IRoleBaseSecurityProviderFactory<>), typeof(RoleBaseSecurityProviderFactory<>)) + .AddScoped(typeof(IDomainSecurityProviderFactory<>), typeof(DomainSecurityProviderFactory<>)) + .AddSingleton() + .AddScoped(typeof(ISecurityFilterFactory<>), typeof(SecurityFilterBuilderFactory<>)) + .AddScoped(typeof(IAccessorsFilterFactory<>), typeof(AccessorsFilterBuilderFactory<>)) + .AddScoped() + .AddKeyedScoped(nameof(SecurityRuleCredential.CurrentUserWithoutRunAsCredential)) + .AddKeyedScoped( + typeof(ISecurityProvider<>), + nameof(DomainSecurityRule.CurrentUser), + typeof(CurrentUserSecurityProvider<>)) + .AddKeyedSingleton( + typeof(ISecurityProvider<>), + nameof(DomainSecurityRule.AccessDenied), + typeof(AccessDeniedSecurityProvider<>)) + .AddKeyedSingleton(typeof(ISecurityProvider<>), nameof(SecurityRule.Disabled), typeof(DisabledSecurityProvider<>)) + .AddSingleton(typeof(ISecurityProvider<>), typeof(DisabledSecurityProvider<>)) + .AddScoped(typeof(IDomainSecurityService<>), typeof(ContextDomainSecurityService<>)) + + .AddScoped() + .AddScoped(sp => + { + var factory = sp.GetRequiredService(); + var securityRuleCredential = sp.GetRequiredService(); + + return factory.Create(securityRuleCredential); + }) + + .AddKeyedScoped( + nameof(SecurityRuleCredential.CurrentUserWithoutRunAsCredential), + (sp, _) => sp.GetRequiredService() + .Create(new SecurityRuleCredential.CurrentUserWithoutRunAsCredential())) + + .AddScoped(sp => + { + var factoryList = sp.GetRequiredService>(); + var securityRuleCredential = sp.GetRequiredService(); + + return factoryList.Select(factory => factory.Create(securityRuleCredential)); + }) + + .AddSingleton() + + .AddSingleton() + + .AddSingleton() + .AddKeyedScoped(RawSecurityAccessorResolver.Key) + .AddScoped() + + .AddScoped() + .AddScoped() + .AddScoped(); } -} +} \ No newline at end of file diff --git a/src/SecuritySystem/DependencyInjection/ServiceCollectionExtensions.cs b/src/SecuritySystem/DependencyInjection/ServiceCollectionExtensions.cs index 67cc6b1..640d358 100644 --- a/src/SecuritySystem/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/SecuritySystem/DependencyInjection/ServiceCollectionExtensions.cs @@ -1,31 +1,4 @@ -using System.Globalization; - -using CommonFramework; -using CommonFramework.ExpressionEvaluate; -using CommonFramework.IdentitySource.DependencyInjection; -using CommonFramework.VisualIdentitySource.DependencyInjection; - -using HierarchicalExpand.DependencyInjection; - -using Microsoft.Extensions.DependencyInjection; - -using SecuritySystem.AvailableSecurity; -using SecuritySystem.Builders._Factory; -using SecuritySystem.Builders.AccessorsBuilder; -using SecuritySystem.Builders.MaterializedBuilder; -using SecuritySystem.Credential; -using SecuritySystem.DomainServices; -using SecuritySystem.Expanders; -using SecuritySystem.ExternalSystem; -using SecuritySystem.ExternalSystem.ApplicationSecurity; -using SecuritySystem.ExternalSystem.Management; -using SecuritySystem.ExternalSystem.SecurityContextStorage; -using SecuritySystem.PermissionOptimization; -using SecuritySystem.Providers; -using SecuritySystem.SecurityAccessor; -using SecuritySystem.SecurityRuleInfo; -using SecuritySystem.Services; -using SecuritySystem.UserSource; +using Microsoft.Extensions.DependencyInjection; namespace SecuritySystem.DependencyInjection; @@ -35,141 +8,13 @@ public static class ServiceCollectionExtensions { public IServiceCollection AddSecuritySystem(Action setupAction) { - services.RegisterGeneralServices(); - var settings = new SecuritySystemSettings(); setupAction(settings); - services.AddIdentitySource(s => settings.IdentitySetupActions.Foreach(action => action(s))); - services.AddHierarchicalExpand(s => settings.HierarchicalSetupActions.ForEach(action => action(s))); - services.AddVisualIdentitySource(s => settings.VisualIdentitySetupActions.ForEach(action => action(s))); - settings.Initialize(services); return services; } - - private IServiceCollection RegisterGeneralServices() - { - return services - - .AddScoped() - - .AddSingleton(typeof(IManagedPrincipalHeaderConverterFactory<>), typeof(ManagedPrincipalHeaderConverterFactory<>)) - .AddSingleton(typeof(IManagedPrincipalHeaderConverter<>), typeof(ManagedPrincipalHeaderConverter<>)) - .AddScoped(typeof(IPrincipalDomainService<>), typeof(PrincipalDomainService<>)) - .AddScoped(typeof(IAvailablePermissionFilterFactory<>), typeof(AvailablePermissionFilterFactory<>)) - .AddScoped(typeof(IAvailablePermissionSource<>), typeof(AvailablePermissionSource<>)) - .AddScoped(typeof(IAvailablePrincipalSource<>), typeof(AvailablePrincipalSource<>)) - .AddSingleton() - - .AddSingleton(typeof(ISecurityIdentityExtractor<>), typeof(SecurityIdentityExtractor<>)) - .AddSingleton(typeof(ISecurityIdentityConverter<>), typeof(SecurityIdentityConverter<>)) - .AddSingleton() - - .AddSingleton() - - .AddSingleton(new FormatProviderSource(CultureInfo.CurrentCulture)) - .AddSingleton(typeof(IIdentsParser<>), typeof(IdentsParser<>)) - .AddSingleton() - - .AddScoped(typeof(ISecurityRepository<>), typeof(SecurityRepository<>)) - .AddSingleton(typeof(ISecurityIdentityFilterFactory<>), typeof(SecurityIdentityFilterFactory<>)) - - .AddSingleton(_ => new ExpressionEvaluatorStorage(LambdaCompileMode.All)) - - .AddSingleton(typeof(IDefaultUserConverter<>), typeof(DefaultUserConverter<>)) - .AddScoped(typeof(ICurrentUserSource<>), typeof(CurrentUserSource<>)) - .AddScoped(typeof(IUserSource<>), typeof(UserSource<>)) - .AddScoped(typeof(IUserQueryableSource<>), typeof(UserQueryableSource<>)) - .AddScoped(typeof(IUserNameResolver<>), typeof(UserNameResolver<>)) - .AddScoped(typeof(IUserFilterFactory<>), typeof(UserFilterFactory<>)) - .AddKeyedScoped(typeof(ICurrentUserSource<>), nameof(SecurityRuleCredential.CurrentUserWithoutRunAsCredential), typeof(RawCurrentUserSource<>)) - .AddSingleton() - - .AddSingleton(typeof(IUserCredentialMatcher<>), typeof(UserCredentialMatcher<>)) - - .AddScoped() - .AddScoped(typeof(LocalStorage<,>)) - - .AddScoped() - - .AddSingleton() - .AddSingleton() - .AddKeyedSingleton(RootClientSecurityRuleInfoSource.ElementKey) - .AddSingleton() - .AddSingleton() - .AddSingleton() - - .AddSingleton() - - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddScoped() - .AddSingleton() - .AddSingleton() - .AddSingleton() - - .AddScoped(typeof(IRoleBaseSecurityProviderFactory<>), typeof(RoleBaseSecurityProviderFactory<>)) - .AddScoped(typeof(IDomainSecurityProviderFactory<>), typeof(DomainSecurityProviderFactory<>)) - .AddSingleton() - .AddScoped(typeof(ISecurityFilterFactory<>), typeof(SecurityFilterBuilderFactory<>)) - .AddScoped(typeof(IAccessorsFilterFactory<>), typeof(AccessorsFilterBuilderFactory<>)) - .AddScoped() - .AddKeyedScoped(nameof(SecurityRuleCredential.CurrentUserWithoutRunAsCredential)) - .AddKeyedScoped( - typeof(ISecurityProvider<>), - nameof(DomainSecurityRule.CurrentUser), - typeof(CurrentUserSecurityProvider<>)) - .AddKeyedSingleton( - typeof(ISecurityProvider<>), - nameof(DomainSecurityRule.AccessDenied), - typeof(AccessDeniedSecurityProvider<>)) - .AddKeyedSingleton(typeof(ISecurityProvider<>), nameof(SecurityRule.Disabled), typeof(DisabledSecurityProvider<>)) - .AddSingleton(typeof(ISecurityProvider<>), typeof(DisabledSecurityProvider<>)) - .AddScoped(typeof(IDomainSecurityService<>), typeof(ContextDomainSecurityService<>)) - - .AddScoped() - .AddScoped(sp => - { - var factory = sp.GetRequiredService(); - var securityRuleCredential = sp.GetRequiredService(); - - return factory.Create(securityRuleCredential); - }) - - .AddKeyedScoped( - nameof(SecurityRuleCredential.CurrentUserWithoutRunAsCredential), - (sp, _) => sp.GetRequiredService() - .Create(new SecurityRuleCredential.CurrentUserWithoutRunAsCredential())) - - .AddScoped(sp => - { - var factoryList = sp.GetRequiredService>(); - var securityRuleCredential = sp.GetRequiredService(); - - return factoryList.Select(factory => factory.Create(securityRuleCredential)); - }) - - .AddSingleton() - - .AddSingleton() - - .AddSingleton() - .AddKeyedScoped(RawSecurityAccessorResolver.Key) - .AddScoped() - - .AddScoped() - .AddScoped() - .AddScoped(); - } } } \ No newline at end of file diff --git a/src/_Example/ExampleApp.IntegrationTests/PermissionDelegatedFromTests.cs b/src/_Example/ExampleApp.IntegrationTests/PermissionDelegatedFromTests.cs index 5e39978..2a3e412 100644 --- a/src/_Example/ExampleApp.IntegrationTests/PermissionDelegatedFromTests.cs +++ b/src/_Example/ExampleApp.IntegrationTests/PermissionDelegatedFromTests.cs @@ -2,7 +2,6 @@ using ExampleApp.Domain; using SecuritySystem; -using SecuritySystem.GeneralPermission; using SecuritySystem.Testing; using SecuritySystem.Validation; diff --git a/src/__SolutionItems/CommonAssemblyInfo.cs b/src/__SolutionItems/CommonAssemblyInfo.cs index 2ace09d..797f406 100644 --- a/src/__SolutionItems/CommonAssemblyInfo.cs +++ b/src/__SolutionItems/CommonAssemblyInfo.cs @@ -3,7 +3,7 @@ [assembly: AssemblyProduct("SecuritySystem")] [assembly: AssemblyCompany("IvAt")] -[assembly: AssemblyVersion("2.2.2.0")] +[assembly: AssemblyVersion("2.2.3.0")] [assembly: AssemblyInformationalVersion("changes at build")] #if DEBUG