From 13004590137d64af5332bec7af184ea0ecb77f75 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Mon, 29 Apr 2024 16:19:23 +0300 Subject: [PATCH 1/3] logut if user is unauthorized --- .../src/lib/services/status-code-error-handler.service.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts index 976bb11702..5bacd7c3c0 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts @@ -17,7 +17,7 @@ export class StatusCodeErrorHandlerService implements CustomHttpErrorHandlerServ protected readonly authService = inject(AuthService); protected readonly handledStatusCodes = [401, 403, 404, 500] as const; - protected status: typeof this.handledStatusCodes[number]; + protected status: (typeof this.handledStatusCodes)[number]; readonly priority = CUSTOM_HTTP_ERROR_HANDLER_PRIORITY.normal; @@ -90,8 +90,9 @@ export class StatusCodeErrorHandlerService implements CustomHttpErrorHandlerServ this.showConfirmation(title, message).subscribe(); break; - case 403: + this.authService.logout(); + break; case 500: this.showPage(); break; From 8139d3c85dcb5811b59fa51a3e050eeae51b3ba6 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Mon, 29 Apr 2024 19:57:16 +0300 Subject: [PATCH 2/3] add error handler service for sessions --- .../lib/providers/error-handlers.provider.ts | 6 ++++ .../services/session-error-handler.service.ts | 30 +++++++++++++++++++ .../status-code-error-handler.service.ts | 2 -- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts b/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts index d456c82912..b0c3e693b9 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts @@ -4,6 +4,7 @@ import { TenantResolveErrorHandlerService } from '../services/tenant-resolve-err import { AbpFormatErrorHandlerService } from '../services/abp-format-error-handler.service'; import { StatusCodeErrorHandlerService } from '../services/status-code-error-handler.service'; import { UnknownStatusCodeErrorHandlerService } from '../services/unknown-status-code-error-handler.service'; +import { AbpSessionErrorHandlerService } from '../services/session-error-handler.service'; export const DEFAULT_HANDLERS_PROVIDERS: Provider[] = [ { @@ -26,4 +27,9 @@ export const DEFAULT_HANDLERS_PROVIDERS: Provider[] = [ multi: true, useExisting: UnknownStatusCodeErrorHandlerService, }, + { + provide: CUSTOM_ERROR_HANDLERS, + multi: true, + useExisting: AbpSessionErrorHandlerService, + }, ]; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts new file mode 100644 index 0000000000..3ba7c7aa76 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts @@ -0,0 +1,30 @@ +import { inject, Injectable } from '@angular/core'; +import { AuthService } from '@abp/ng.core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { getErrorFromRequestBody } from '../utils/error.utils'; +import { CustomHttpErrorHandlerService } from '../models/common'; +import { ConfirmationService } from '../services/confirmation.service'; +import { CUSTOM_HTTP_ERROR_HANDLER_PRIORITY } from '../constants/default-errors'; + +@Injectable({ providedIn: 'root' }) +export class AbpSessionErrorHandlerService implements CustomHttpErrorHandlerService { + readonly priority = CUSTOM_HTTP_ERROR_HANDLER_PRIORITY.high; + private authService = inject(AuthService); + + canHandle(error: unknown): boolean { + console.log(error); + debugger; + if ( + error instanceof HttpErrorResponse && + error.headers.get('expires') && + error.headers.get('pragma') + ) { + return true; + } + return false; + } + + execute() { + this.authService.logout(); + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts index 5bacd7c3c0..0e22ac458c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts @@ -91,8 +91,6 @@ export class StatusCodeErrorHandlerService implements CustomHttpErrorHandlerServ this.showConfirmation(title, message).subscribe(); break; case 403: - this.authService.logout(); - break; case 500: this.showPage(); break; From d2b2bc712d913c7b6dbdf5b5e0cf1fd4f88d6576 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Tue, 30 Apr 2024 14:34:34 +0300 Subject: [PATCH 3/3] handle 401 authentication error in a new service --- .../lib/providers/error-handlers.provider.ts | 14 +++++---- .../authentication-error-handler.service.ts | 24 +++++++++++++++ .../theme-shared/src/lib/services/index.ts | 1 + .../services/session-error-handler.service.ts | 30 ------------------- 4 files changed, 33 insertions(+), 36 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts delete mode 100644 npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts b/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts index b0c3e693b9..84e8fe9b19 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts @@ -1,10 +1,12 @@ import { Provider } from '@angular/core'; import { CUSTOM_ERROR_HANDLERS } from '../tokens'; -import { TenantResolveErrorHandlerService } from '../services/tenant-resolve-error-handler.service'; -import { AbpFormatErrorHandlerService } from '../services/abp-format-error-handler.service'; -import { StatusCodeErrorHandlerService } from '../services/status-code-error-handler.service'; -import { UnknownStatusCodeErrorHandlerService } from '../services/unknown-status-code-error-handler.service'; -import { AbpSessionErrorHandlerService } from '../services/session-error-handler.service'; +import { + TenantResolveErrorHandlerService, + AbpFormatErrorHandlerService, + StatusCodeErrorHandlerService, + UnknownStatusCodeErrorHandlerService, + AbpAuthenticationErrorHandler, +} from '../services'; export const DEFAULT_HANDLERS_PROVIDERS: Provider[] = [ { @@ -30,6 +32,6 @@ export const DEFAULT_HANDLERS_PROVIDERS: Provider[] = [ { provide: CUSTOM_ERROR_HANDLERS, multi: true, - useExisting: AbpSessionErrorHandlerService, + useExisting: AbpAuthenticationErrorHandler, }, ]; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts new file mode 100644 index 0000000000..602514bee8 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts @@ -0,0 +1,24 @@ +import { inject, Injectable } from '@angular/core'; +import { AuthService, ConfigStateService } from '@abp/ng.core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { CustomHttpErrorHandlerService } from '../models/common'; +import { CUSTOM_HTTP_ERROR_HANDLER_PRIORITY } from '../constants/default-errors'; + +@Injectable({ providedIn: 'root' }) +export class AbpAuthenticationErrorHandler implements CustomHttpErrorHandlerService { + readonly priority = CUSTOM_HTTP_ERROR_HANDLER_PRIORITY.veryHigh; + protected readonly authService = inject(AuthService); + protected readonly configStateService = inject(ConfigStateService); + + canHandle(error: unknown): boolean { + return error instanceof HttpErrorResponse && error.status === 401; + } + + execute() { + this.configStateService.refreshAppState().subscribe(({ currentUser }) => { + if (!currentUser.isAuthenticated) { + this.authService.logout(); + } + }); + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts index 41f1b84039..521d86b9c2 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts @@ -9,3 +9,4 @@ export * from './tenant-resolve-error-handler.service'; export * from './status-code-error-handler.service'; export * from './unknown-status-code-error-handler.service'; export * from './router-error-handler.service'; +export * from './authentication-error-handler.service' diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts deleted file mode 100644 index 3ba7c7aa76..0000000000 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { inject, Injectable } from '@angular/core'; -import { AuthService } from '@abp/ng.core'; -import { HttpErrorResponse } from '@angular/common/http'; -import { getErrorFromRequestBody } from '../utils/error.utils'; -import { CustomHttpErrorHandlerService } from '../models/common'; -import { ConfirmationService } from '../services/confirmation.service'; -import { CUSTOM_HTTP_ERROR_HANDLER_PRIORITY } from '../constants/default-errors'; - -@Injectable({ providedIn: 'root' }) -export class AbpSessionErrorHandlerService implements CustomHttpErrorHandlerService { - readonly priority = CUSTOM_HTTP_ERROR_HANDLER_PRIORITY.high; - private authService = inject(AuthService); - - canHandle(error: unknown): boolean { - console.log(error); - debugger; - if ( - error instanceof HttpErrorResponse && - error.headers.get('expires') && - error.headers.get('pragma') - ) { - return true; - } - return false; - } - - execute() { - this.authService.logout(); - } -}