From da1c4ccdb7e6ae5ed11ce015fa986601ad058ff1 Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 11 Apr 2021 16:11:12 +0800 Subject: [PATCH 01/11] Add document of IAbpClaimsPrincipalFactory. --- docs/en/Authorization.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index fbb71bb3d4..c01d92b64d 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -393,6 +393,38 @@ public override void ConfigureServices(ServiceConfigurationContext context) This is already done for the startup template integration tests. +### Claims Principal Factory + +Abp abstracts the way that authentication creates `ClaimsPrincipal`. You can provide a custom `IAbpClaimsPrincipalContributor` to add additional claims. + +Example of add `EditionId` of current tenant to user claims: + +```csharp +public class EditionClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency +{ + public async Task ContributeAsync(AbpClaimsPrincipalContributorContext context) + { + var identity = context.ClaimsPrincipal.Identities.FirstOrDefault(); + if (identity != null) + { + var currentTenant = context.ServiceProvider.GetRequiredService(); + if (currentTenant.Id != null) + { + var tenantRepository = context.ServiceProvider.GetRequiredService(); + var tenant = await tenantRepository.FindAsync(currentTenant.Id.Value); + if (tenant?.EditionId != null) + { + identity.AddOrReplace(new Claim(AbpClaimTypes.EditionId, tenant.EditionId.ToString())); + } + } + } + } +} +``` +The `EditionClaimsPrincipalContributor` will participate in it when the `CreateAsync` method of `IAbpClaimsPrincipalFactory` is called. + +> The Identity module has integrated it. + ## See Also * [Permission Management Module](Modules/Permission-Management.md) From 08acfa664063712e10f09f9653711729e4757ac0 Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 11 Apr 2021 16:12:35 +0800 Subject: [PATCH 02/11] Update Authorization.md --- docs/en/Authorization.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index c01d92b64d..e04c6c159e 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -421,6 +421,7 @@ public class EditionClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, } } ``` + The `EditionClaimsPrincipalContributor` will participate in it when the `CreateAsync` method of `IAbpClaimsPrincipalFactory` is called. > The Identity module has integrated it. From bdf555ae075bc40a8835ca80bdebe7da32eed25e Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 11 Apr 2021 16:15:44 +0800 Subject: [PATCH 03/11] Update Authorization.md --- docs/en/Authorization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index e04c6c159e..f9a0be5292 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -424,7 +424,7 @@ public class EditionClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, The `EditionClaimsPrincipalContributor` will participate in it when the `CreateAsync` method of `IAbpClaimsPrincipalFactory` is called. -> The Identity module has integrated it. +> The [Identity module](https://docs.abp.io/en/abp/latest/Modules/Identity) has integrated it. ## See Also From 53b49c13557e070ca485911474a6f0d20d592674 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 16 Apr 2021 09:49:19 +0800 Subject: [PATCH 04/11] Update Authorization.md --- docs/en/Authorization.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index f9a0be5292..d41879cd9b 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -397,24 +397,24 @@ This is already done for the startup template integration tests. Abp abstracts the way that authentication creates `ClaimsPrincipal`. You can provide a custom `IAbpClaimsPrincipalContributor` to add additional claims. -Example of add `EditionId` of current tenant to user claims: +Example of add `SocialSecurityNumber` of current tenant to user claims: ```csharp -public class EditionClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency +public class SocialSecurityNumberClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency { public async Task ContributeAsync(AbpClaimsPrincipalContributorContext context) { var identity = context.ClaimsPrincipal.Identities.FirstOrDefault(); if (identity != null) { - var currentTenant = context.ServiceProvider.GetRequiredService(); - if (currentTenant.Id != null) + var currentUser = context.ServiceProvider.GetRequiredService(); + if (currentUser.Id.HasValue) { - var tenantRepository = context.ServiceProvider.GetRequiredService(); - var tenant = await tenantRepository.FindAsync(currentTenant.Id.Value); - if (tenant?.EditionId != null) + var userManager = context.ServiceProvider.GetRequiredService(); + var user = await userManager.GetByIdAsync(currentUser.Id.Value); + if (user?.SocialSecurityNumber != null) { - identity.AddOrReplace(new Claim(AbpClaimTypes.EditionId, tenant.EditionId.ToString())); + identity.AddOrReplace(new Claim("SocialSecurityNumber", user.SocialSecurityNumber)); } } } @@ -422,7 +422,7 @@ public class EditionClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, } ``` -The `EditionClaimsPrincipalContributor` will participate in it when the `CreateAsync` method of `IAbpClaimsPrincipalFactory` is called. +The `SocialSecurityNumberClaimsPrincipalContributor` will participate in it when the `CreateAsync` method of `IAbpClaimsPrincipalFactory` is called. > The [Identity module](https://docs.abp.io/en/abp/latest/Modules/Identity) has integrated it. From 149dff4d7ec268096812ca0a0dcb9d2aa387cdc4 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 16 Apr 2021 09:49:52 +0800 Subject: [PATCH 05/11] Update Authorization.md --- docs/en/Authorization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index d41879cd9b..44d01118b5 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -397,7 +397,7 @@ This is already done for the startup template integration tests. Abp abstracts the way that authentication creates `ClaimsPrincipal`. You can provide a custom `IAbpClaimsPrincipalContributor` to add additional claims. -Example of add `SocialSecurityNumber` of current tenant to user claims: +Example of add `SocialSecurityNumber` of current user to claims: ```csharp public class SocialSecurityNumberClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency From 7b920f0f844360d29f6649615272631af42093b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 18 Apr 2021 18:39:52 +0300 Subject: [PATCH 06/11] Updated summaries --- ...bpCommonDbContextRegistrationOptionsBuilder.cs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs index ebe49718b2..34e74d90cd 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs @@ -9,43 +9,42 @@ namespace Volo.Abp.DependencyInjection IServiceCollection Services { get; } /// - /// Registers default repositories for this DbContext. + /// Registers default repositories for all the entities in this DbContext. /// /// /// Registers repositories only for aggregate root entities by default. - /// set to true to include all entities. + /// Set to true to include all entities. /// IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(bool includeAllEntities = false); /// - /// Registers default repositories for this DbContext. + /// Registers default repositories for all the entities in this DbContext. /// Default repositories will use given . /// /// DbContext type that will be used by default repositories /// /// Registers repositories only for aggregate root entities by default. - /// set to true to include all entities. + /// Set to true to include all entities. /// IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(bool includeAllEntities = false); /// - /// Registers default repositories for this DbContext. + /// Registers default repositories for all the entities in this DbContext. /// Default repositories will use given . /// /// DbContext type that will be used by default repositories /// /// Registers repositories only for aggregate root entities by default. - /// set to true to include all entities. + /// Set to true to include all entities. /// IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false); /// - /// Registers custom repository for a specific entity. + /// Registers default repository for a specific entity. /// /// Entity type IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(); - /// /// Registers default repository for a specific entity. /// From 8670b61c0a9e5fb1abf7f857636bb2e757e7fc57 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 19 Apr 2021 11:12:28 +0800 Subject: [PATCH 07/11] Add RequireFeature & GlobalFeatures to permissions. --- .../GlobalFeatureDefinitionExtensions.cs | 27 ++++++- ...reGlobalFeaturesPermissionStateProvider.cs | 15 +++- ...CmsKitAdminPermissionDefinitionProvider.cs | 71 ++++++++++--------- 3 files changed, 75 insertions(+), 38 deletions(-) diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs index 200f002e07..299994e695 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using System; +using JetBrains.Annotations; using Volo.Abp.Authorization.Permissions; namespace Volo.Abp.GlobalFeatures @@ -6,12 +7,12 @@ namespace Volo.Abp.GlobalFeatures public static class GlobalFeatureDefinitionExtensions { public static PermissionDefinition RequireGlobalFeatures( - this PermissionDefinition permissionDefinition, + this PermissionDefinition permissionDefinition, params string[] globalFeatures) { return permissionDefinition.RequireGlobalFeatures(true, globalFeatures); } - + public static PermissionDefinition RequireGlobalFeatures( [NotNull] this PermissionDefinition permissionDefinition, bool requiresAll, @@ -25,5 +26,25 @@ namespace Volo.Abp.GlobalFeatures ); } + public static PermissionDefinition RequireGlobalFeatures( + this PermissionDefinition permissionDefinition, + params Type[] globalFeatures) + { + return permissionDefinition.RequireGlobalFeatures(true, globalFeatures); + } + + public static PermissionDefinition RequireGlobalFeatures( + [NotNull] this PermissionDefinition permissionDefinition, + bool requiresAll, + params Type[] globalFeatures) + { + Check.NotNull(permissionDefinition, nameof(permissionDefinition)); + Check.NotNullOrEmpty(globalFeatures, nameof(globalFeatures)); + + return permissionDefinition.AddStateProviders( + new RequireGlobalFeaturesPermissionStateProvider(requiresAll, globalFeatures) + ); + } + } } diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesPermissionStateProvider.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesPermissionStateProvider.cs index 40df2a14b3..c96e652e8c 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesPermissionStateProvider.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesPermissionStateProvider.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using Volo.Abp.Authorization.Permissions; @@ -13,7 +14,7 @@ namespace Volo.Abp.GlobalFeatures : this(true, globalFeatureNames) { } - + public RequireGlobalFeaturesPermissionStateProvider(bool requiresAll, params string[] globalFeatureNames) { Check.NotNullOrEmpty(globalFeatureNames, nameof(globalFeatureNames)); @@ -22,12 +23,20 @@ namespace Volo.Abp.GlobalFeatures _globalFeatureNames = globalFeatureNames; } + public RequireGlobalFeaturesPermissionStateProvider(bool requiresAll, params Type[] globalFeatureNames) + { + Check.NotNullOrEmpty(globalFeatureNames, nameof(globalFeatureNames)); + + _requiresAll = requiresAll; + _globalFeatureNames = globalFeatureNames.Select(GlobalFeatureNameAttribute.GetName).ToArray(); + } + public Task IsEnabledAsync(PermissionStateContext context) { bool isEnabled = _requiresAll ? _globalFeatureNames.All(x => GlobalFeatureManager.Instance.IsEnabled(x)) : _globalFeatureNames.Any(x => GlobalFeatureManager.Instance.IsEnabled(x)); - + return Task.FromResult(isEnabled); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs index 3df0e205d5..a260b71e99 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs @@ -13,41 +13,48 @@ namespace Volo.CmsKit.Permissions { var cmsGroup = context.GetGroupOrNull(CmsKitAdminPermissions.GroupName) ?? context.AddGroup(CmsKitAdminPermissions.GroupName, L("Permission:CmsKit")); - if (GlobalFeatureManager.Instance.IsEnabled()) - { - var contentGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Comments.Default, L("Permission:Comments")); - contentGroup.AddChild(CmsKitAdminPermissions.Comments.Delete, L("Permission:Comments.Delete")); - } - - if (GlobalFeatureManager.Instance.IsEnabled()) - { - var tagGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Tags.Default, L("Permission:TagManagement")); - tagGroup.AddChild(CmsKitAdminPermissions.Tags.Create, L("Permission:TagManagement.Create")); - tagGroup.AddChild(CmsKitAdminPermissions.Tags.Update, L("Permission:TagManagement.Update")); - tagGroup.AddChild(CmsKitAdminPermissions.Tags.Delete, L("Permission:TagManagement.Delete")); - } + var contentGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Comments.Default, L("Permission:Comments")) + .RequireGlobalFeatures(typeof(CommentsFeature)); + contentGroup.AddChild(CmsKitAdminPermissions.Comments.Delete, L("Permission:Comments.Delete")) + .RequireGlobalFeatures(typeof(CommentsFeature)); - if (GlobalFeatureManager.Instance.IsEnabled()) - { - var pageManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Pages.Default, L("Permission:PageManagement")); - pageManagement.AddChild(CmsKitAdminPermissions.Pages.Create, L("Permission:PageManagement:Create")); - pageManagement.AddChild(CmsKitAdminPermissions.Pages.Update, L("Permission:PageManagement:Update")); - pageManagement.AddChild(CmsKitAdminPermissions.Pages.Delete, L("Permission:PageManagement:Delete")); - } + var tagGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Tags.Default, L("Permission:TagManagement")) + .RequireGlobalFeatures(typeof(TagsFeature)); + tagGroup.AddChild(CmsKitAdminPermissions.Tags.Create, L("Permission:TagManagement.Create")) + .RequireGlobalFeatures(typeof(TagsFeature)); + tagGroup.AddChild(CmsKitAdminPermissions.Tags.Update, L("Permission:TagManagement.Update")) + .RequireGlobalFeatures(typeof(TagsFeature)); + tagGroup.AddChild(CmsKitAdminPermissions.Tags.Delete, L("Permission:TagManagement.Delete")) + .RequireGlobalFeatures(typeof(TagsFeature)); - if (GlobalFeatureManager.Instance.IsEnabled()) - { - var blogManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Blogs.Default, L("Permission:BlogManagement")); - blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Create, L("Permission:BlogManagement.Create")); - blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Update, L("Permission:BlogManagement.Update")); - blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Delete, L("Permission:BlogManagement.Delete")); - blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Features, L("Permission:BlogManagement.Features")); + var pageManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Pages.Default, L("Permission:PageManagement")) + .RequireGlobalFeatures(typeof(PagesFeature)); + pageManagement.AddChild(CmsKitAdminPermissions.Pages.Create, L("Permission:PageManagement:Create")) + .RequireGlobalFeatures(typeof(PagesFeature)); + pageManagement.AddChild(CmsKitAdminPermissions.Pages.Update, L("Permission:PageManagement:Update")) + .RequireGlobalFeatures(typeof(PagesFeature)); + pageManagement.AddChild(CmsKitAdminPermissions.Pages.Delete, L("Permission:PageManagement:Delete")) + .RequireGlobalFeatures(typeof(PagesFeature)); - var blogPostManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.BlogPosts.Default, L("Permission:BlogPostManagement")); - blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Create, L("Permission:BlogPostManagement.Create")); - blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Update, L("Permission:BlogPostManagement.Update")); - blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete")); - } + var blogManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Blogs.Default, L("Permission:BlogManagement")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Create, L("Permission:BlogManagement.Create")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Update, L("Permission:BlogManagement.Update")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Delete, L("Permission:BlogManagement.Delete")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Features, L("Permission:BlogManagement.Features")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + + var blogPostManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.BlogPosts.Default, L("Permission:BlogPostManagement")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Create, L("Permission:BlogPostManagement.Create")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Update, L("Permission:BlogPostManagement.Update")) + .RequireGlobalFeatures(typeof(BlogsFeature)); + blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete")) + .RequireGlobalFeatures(typeof(BlogsFeature)); } private static LocalizableString L(string name) From df361fb3d91c6edce56d94c42ae5f2594983224a Mon Sep 17 00:00:00 2001 From: bnymncoskuner Date: Mon, 19 Apr 2021 14:00:13 +0300 Subject: [PATCH 08/11] fix: provide a way to handle app config error --- .../packages/core/src/lib/tokens/app-config.token.ts | 7 +++++++ npm/ng-packs/packages/core/src/lib/tokens/index.ts | 1 + .../packages/core/src/lib/utils/initial-utils.ts | 12 +++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts diff --git a/npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts new file mode 100644 index 0000000000..73151da743 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts @@ -0,0 +1,7 @@ +import { InjectionToken } from '@angular/core'; + +export type AppConfigInitErrorFn = (error: any) => void; + +export const APP_CONFIG_INITIALIZATION_ERROR = new InjectionToken( + 'APP_CONFIG_INITIALIZATION_ERROR', +); diff --git a/npm/ng-packs/packages/core/src/lib/tokens/index.ts b/npm/ng-packs/packages/core/src/lib/tokens/index.ts index afad50b1c8..c40fbc1bc0 100644 --- a/npm/ng-packs/packages/core/src/lib/tokens/index.ts +++ b/npm/ng-packs/packages/core/src/lib/tokens/index.ts @@ -2,3 +2,4 @@ export * from './list.token'; export * from './lodaer-delay.token'; export * from './manage-profile.token'; export * from './options.token'; +export * from './app-config.token'; diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts index 9d5f7483fe..c416eaec79 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts @@ -1,7 +1,8 @@ import { registerLocaleData } from '@angular/common'; import { Injector } from '@angular/core'; import { OAuthService } from 'angular-oauth2-oidc'; -import { tap } from 'rxjs/operators'; +import { tap, catchError } from 'rxjs/operators'; +import { throwError } from 'rxjs'; import { ABP } from '../models/common'; import { Environment } from '../models/environment'; import { AbpApplicationConfigurationService } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service'; @@ -12,6 +13,7 @@ import { EnvironmentService } from '../services/environment.service'; import { SessionStateService } from '../services/session-state.service'; import { clearOAuthStorage } from '../strategies/auth-flow.strategy'; import { CORE_OPTIONS } from '../tokens/options.token'; +import { APP_CONFIG_INITIALIZATION_ERROR } from '../tokens/app-config.token'; import { getRemoteEnv } from './environment-utils'; import { parseTenantFromUrl } from './multi-tenancy-utils'; @@ -38,6 +40,14 @@ export function getInitialData(injector: Injector) { const currentTenant = configState.getOne('currentTenant') as CurrentTenantDto; injector.get(SessionStateService).setTenant(currentTenant); }), + catchError(error => { + const appConfig = injector.get(APP_CONFIG_INITIALIZATION_ERROR); + if (appConfig && appConfig.length) { + appConfig.forEach(fn => fn(error)); + } + + return throwError(error); + }), ) .toPromise(); }; From 250de034cd8f0ce42e44c3f76b7aba2445114390 Mon Sep 17 00:00:00 2001 From: bnymncoskuner Date: Mon, 19 Apr 2021 14:09:32 +0300 Subject: [PATCH 09/11] refactor: better naming for app init error --- .../packages/core/src/lib/tokens/app-config.token.ts | 6 +++--- npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts index 73151da743..a6343af170 100644 --- a/npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts +++ b/npm/ng-packs/packages/core/src/lib/tokens/app-config.token.ts @@ -1,7 +1,7 @@ import { InjectionToken } from '@angular/core'; -export type AppConfigInitErrorFn = (error: any) => void; +export type AppInitErrorFn = (error: any) => void; -export const APP_CONFIG_INITIALIZATION_ERROR = new InjectionToken( - 'APP_CONFIG_INITIALIZATION_ERROR', +export const APP_INIT_ERROR_HANDLERS = new InjectionToken( + 'APP_INIT_ERROR_HANDLERS', ); diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts index c416eaec79..c4edc800b5 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts @@ -13,7 +13,7 @@ import { EnvironmentService } from '../services/environment.service'; import { SessionStateService } from '../services/session-state.service'; import { clearOAuthStorage } from '../strategies/auth-flow.strategy'; import { CORE_OPTIONS } from '../tokens/options.token'; -import { APP_CONFIG_INITIALIZATION_ERROR } from '../tokens/app-config.token'; +import { APP_INIT_ERROR_HANDLERS } from '../tokens/app-config.token'; import { getRemoteEnv } from './environment-utils'; import { parseTenantFromUrl } from './multi-tenancy-utils'; @@ -41,9 +41,9 @@ export function getInitialData(injector: Injector) { injector.get(SessionStateService).setTenant(currentTenant); }), catchError(error => { - const appConfig = injector.get(APP_CONFIG_INITIALIZATION_ERROR); - if (appConfig && appConfig.length) { - appConfig.forEach(fn => fn(error)); + const appInitErrorHandlers = injector.get(APP_INIT_ERROR_HANDLERS); + if (appInitErrorHandlers && appInitErrorHandlers.length) { + appInitErrorHandlers.forEach(fn => fn(error)); } return throwError(error); From 389400c647509fa5a1338e7deb1fc6958cbb594e Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Mon, 19 Apr 2021 15:10:14 +0300 Subject: [PATCH 10/11] info logging added. --- .../Volo/Abp/Cli/Bundling/BundlingService.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs index cc8d9c0bf5..74be59e014 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs @@ -77,17 +77,25 @@ namespace Volo.Abp.Cli.Bundling BundleName = bundleConfig.Name.IsNullOrEmpty() ? "global" : bundleConfig.Name, Minify = bundleConfig.Mode == BundlingMode.BundleAndMinify }; - + + Logger.LogInformation("Generating style bundle..."); styleDefinitions = StyleBundler.Bundle(options, styleContext); + Logger.LogInformation($"Style bundle has been generated successfully."); + + Logger.LogInformation("Generating script bundle..."); scriptDefinitions = ScriptBundler.Bundle(options, scriptContext); + Logger.LogInformation($"Script bundle has been generated successfully."); } else { + Logger.LogInformation("Generating style references..."); styleDefinitions = GenerateStyleDefinitions(styleContext); + Logger.LogInformation("Generating script references..."); scriptDefinitions = GenerateScriptDefinitions(scriptContext); } - + await UpdateDependenciesInHtmlFileAsync(directory, styleDefinitions, scriptDefinitions); + Logger.LogInformation("Script and style references in the index.html file have been updated."); } private BundleContext GetScriptContext(List bundleDefinitions, From ebaf89f54cf499d48d1135e08a4a0f1fad6972e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 19 Apr 2021 17:02:45 +0300 Subject: [PATCH 11/11] Revisit Claims Principal Factory section. --- docs/en/Authorization.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index 44d01118b5..270345f444 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -395,9 +395,9 @@ This is already done for the startup template integration tests. ### Claims Principal Factory -Abp abstracts the way that authentication creates `ClaimsPrincipal`. You can provide a custom `IAbpClaimsPrincipalContributor` to add additional claims. +Claims are important elements of authentication and authorization. ABP uses the `IAbpClaimsPrincipalFactory` service to create claims on authentication. This service was designed as extensible. If you need to add your custom claims to the authentication ticket, you can implement the `IAbpClaimsPrincipalContributor` in your application. -Example of add `SocialSecurityNumber` of current user to claims: +**Example: Add a `SocialSecurityNumber` claim:** ```csharp public class SocialSecurityNumberClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency @@ -410,11 +410,11 @@ public class SocialSecurityNumberClaimsPrincipalContributor : IAbpClaimsPrincipa var currentUser = context.ServiceProvider.GetRequiredService(); if (currentUser.Id.HasValue) { - var userManager = context.ServiceProvider.GetRequiredService(); - var user = await userManager.GetByIdAsync(currentUser.Id.Value); - if (user?.SocialSecurityNumber != null) + var userService = context.ServiceProvider.GetRequiredService(); //Your custom service + var socialSecurityNumber = await userService.GetSocialSecurityNumberAsync(currentUser.Id.Value); + if (userService != null) { - identity.AddOrReplace(new Claim("SocialSecurityNumber", user.SocialSecurityNumber)); + identity.AddOrReplace(new Claim("SocialSecurityNumber", userService)); } } } @@ -422,10 +422,6 @@ public class SocialSecurityNumberClaimsPrincipalContributor : IAbpClaimsPrincipa } ``` -The `SocialSecurityNumberClaimsPrincipalContributor` will participate in it when the `CreateAsync` method of `IAbpClaimsPrincipalFactory` is called. - -> The [Identity module](https://docs.abp.io/en/abp/latest/Modules/Identity) has integrated it. - ## See Also * [Permission Management Module](Modules/Permission-Management.md)