@tilde-nlp/ngx-user-access 8.0.2 → 8.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -61
- package/fesm2022/tilde-nlp-ngx-user-access.mjs +20 -9
- package/fesm2022/tilde-nlp-ngx-user-access.mjs.map +1 -1
- package/index.d.ts +53 -49
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,63 +1,64 @@
|
|
|
1
1
|
# NgxUserAccess
|
|
2
2
|
|
|
3
|
-
This
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
3
|
+
This library is designed to include shared user access services, such as Authentication, Permissions, and Keycloak.
|
|
4
|
+
Here, we store all the user-related resources used across different projects.
|
|
5
|
+
|
|
6
|
+
# Implementation
|
|
7
|
+
|
|
8
|
+
To integrate this library into your project, add @tilde-nlp/ngx-user-access to your dependencies.
|
|
9
|
+
|
|
10
|
+
1. Review the `UserAccessConfig` interface and supply the required fields in the configuration token `USER_ACCESS_CONFIG_TOKEN`.
|
|
11
|
+
|
|
12
|
+
2. To configure custom user permissions you should provide `UserConfigurationService` in your application.
|
|
13
|
+
|
|
14
|
+
3. The `KEYCLOAK_PROVIDER` should be provided in each app config, but only after you've set up `USER_ACCESS_CONFIG_TOKEN`.
|
|
15
|
+
|
|
16
|
+
`Required configuration example below:`
|
|
17
|
+
|
|
18
|
+
`
|
|
19
|
+
class AppUserCustomConfigurationService implements UserCustomConfiguration<UserConfiguration> {
|
|
20
|
+
updateUserConfiguration(currentConfiguration: UserConfiguration, newConfiguration: UserConfiguration): UserConfiguration {
|
|
21
|
+
let configuration: UserConfiguration = {};
|
|
22
|
+
|
|
23
|
+
return configuration;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function USER_CUSTOM_CONFIGURATION_SERVICE_PROVIDER() {
|
|
28
|
+
return {
|
|
29
|
+
provide: UserConfigurationService,
|
|
30
|
+
useClass: AppUserCustomConfigurationService
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function USER_ACCESS_CONFIG_PROVIDER() {
|
|
35
|
+
return {
|
|
36
|
+
provide: USER_ACCESS_CONFIG_TOKEN,
|
|
37
|
+
useFactory: (configService: ConfigurationService): UserAccessConfig => {
|
|
38
|
+
const config = configService.configuration;
|
|
39
|
+
|
|
40
|
+
// kc token makes strapi return 401, so no need to send it to strapi.
|
|
41
|
+
if (!config?.strapi?.disabled) {
|
|
42
|
+
EXCLUDE_AUTH_HEADERS_URLS.push(config.strapi!.url!);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
keycloak: { ...config.auth.keycloak!, bearerExcludedUrls: EXCLUDE_AUTH_HEADERS_URLS },
|
|
47
|
+
plans: Object.values([]),
|
|
48
|
+
subscriptions: config.subscription,
|
|
49
|
+
alwaysAuth: config.auth.alwaysAuth
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
deps: [ConfigurationService]
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const USER_ACCESS_PROVIDERS: Provider[] = [USER_ACCESS_CONFIG_PROVIDER(), USER_CUSTOM_CONFIGURATION_SERVICE_PROVIDER()];
|
|
56
|
+
|
|
57
|
+
providers: [
|
|
58
|
+
KeycloakService,
|
|
59
|
+
USER_ACCESS_PROVIDERS,
|
|
60
|
+
provideAppInitializer(async () => {
|
|
61
|
+
return await KEYCLOAK_PROVIDER()
|
|
62
|
+
}),
|
|
63
|
+
]
|
|
64
|
+
`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, Injectable
|
|
2
|
+
import { InjectionToken, inject, Injectable } from '@angular/core';
|
|
3
3
|
import * as i2 from 'keycloak-angular';
|
|
4
4
|
import { KeycloakService, KeycloakEventTypeLegacy, KeycloakBearerInterceptor } from 'keycloak-angular';
|
|
5
5
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
@@ -35,8 +35,6 @@ var DefaultPermissions;
|
|
|
35
35
|
DefaultPermissions["ALL"] = "ALL";
|
|
36
36
|
})(DefaultPermissions || (DefaultPermissions = {}));
|
|
37
37
|
|
|
38
|
-
const USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN = new InjectionToken('USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN');
|
|
39
|
-
|
|
40
38
|
class AuthService {
|
|
41
39
|
get token() {
|
|
42
40
|
return this._token;
|
|
@@ -172,6 +170,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImpor
|
|
|
172
170
|
}]
|
|
173
171
|
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.KeycloakService }, { type: AuthService }] });
|
|
174
172
|
|
|
173
|
+
class UserConfigurationService {
|
|
174
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
175
|
+
updateUserConfiguration(_currentConfiguration, _newConfiguration) {
|
|
176
|
+
const configuration = {};
|
|
177
|
+
return configuration;
|
|
178
|
+
}
|
|
179
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: UserConfigurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
180
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: UserConfigurationService, providedIn: 'root' }); }
|
|
181
|
+
}
|
|
182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: UserConfigurationService, decorators: [{
|
|
183
|
+
type: Injectable,
|
|
184
|
+
args: [{
|
|
185
|
+
providedIn: 'root',
|
|
186
|
+
}]
|
|
187
|
+
}] });
|
|
188
|
+
|
|
175
189
|
class PermissionsService {
|
|
176
190
|
get statusLocalStorageKey() {
|
|
177
191
|
return this.userSpecificLocalstorageKey(this.status);
|
|
@@ -441,7 +455,7 @@ class PermissionsService {
|
|
|
441
455
|
isSupport() {
|
|
442
456
|
return this.token?.realm_access?.roles?.includes(this.SUPPORT_ROLE_KEY);
|
|
443
457
|
}
|
|
444
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: PermissionsService, deps: [{ token: UserAccessConfigService }, { token: AuthService }, { token:
|
|
458
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: PermissionsService, deps: [{ token: UserAccessConfigService }, { token: AuthService }, { token: UserConfigurationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
445
459
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: PermissionsService, providedIn: 'root' }); }
|
|
446
460
|
}
|
|
447
461
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: PermissionsService, decorators: [{
|
|
@@ -449,10 +463,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImpor
|
|
|
449
463
|
args: [{
|
|
450
464
|
providedIn: 'root',
|
|
451
465
|
}]
|
|
452
|
-
}], ctorParameters: () => [{ type: UserAccessConfigService }, { type: AuthService }, { type:
|
|
453
|
-
type: Inject,
|
|
454
|
-
args: [USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN]
|
|
455
|
-
}] }] });
|
|
466
|
+
}], ctorParameters: () => [{ type: UserAccessConfigService }, { type: AuthService }, { type: UserConfigurationService }] });
|
|
456
467
|
|
|
457
468
|
async function KEYCLOAK_INITIALIZER() {
|
|
458
469
|
const keycloak = inject(KeycloakService);
|
|
@@ -512,5 +523,5 @@ async function KEYCLOAK_PROVIDER() {
|
|
|
512
523
|
* Generated bundle index. Do not edit.
|
|
513
524
|
*/
|
|
514
525
|
|
|
515
|
-
export { AuthGuard, AuthGuardParamKeys, AuthService, DefaultPermissions, KEYCLOAK_PROVIDER, PermissionStatus, PermissionsService, USER_ACCESS_CONFIG_TOKEN,
|
|
526
|
+
export { AuthGuard, AuthGuardParamKeys, AuthService, DefaultPermissions, KEYCLOAK_PROVIDER, PermissionStatus, PermissionsService, USER_ACCESS_CONFIG_TOKEN, UserAccessConfigService, UserConfigurationService };
|
|
516
527
|
//# sourceMappingURL=tilde-nlp-ngx-user-access.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tilde-nlp-ngx-user-access.mjs","sources":["../../../projects/ngx-user-access/src/lib/user-access-config/tokens/user-access-config,.token.ts","../../../projects/ngx-user-access/src/lib/user-access-config/user-access-config.service.ts","../../../projects/ngx-user-access/src/lib/permissions/models/permission-status.model.ts","../../../projects/ngx-user-access/src/lib/permissions/models/default-permissions.enum.ts","../../../projects/ngx-user-access/src/lib/permissions/models/user-custom-configuration-service.token.ts","../../../projects/ngx-user-access/src/lib/auth/auth.service.ts","../../../projects/ngx-user-access/src/lib/auth/models/auth-guard-param-keys.enum.ts","../../../projects/ngx-user-access/src/lib/auth/auth.guard.ts","../../../projects/ngx-user-access/src/lib/permissions/permissions.service.ts","../../../projects/ngx-user-access/src/lib/keycloak/keycloak.initializer.ts","../../../projects/ngx-user-access/src/lib/keycloak/keycloak.provider.ts","../../../projects/ngx-user-access/src/tilde-nlp-ngx-user-access.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { UserAccessConfig } from '../models/user-access-config.model';\r\n\r\nexport const USER_ACCESS_CONFIG_TOKEN = new InjectionToken<UserAccessConfig>('USER_ACCESS_CONFIG_TOKEN');\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { USER_ACCESS_CONFIG_TOKEN } from './tokens/user-access-config,.token';\r\nimport { UserAccessConfig } from './models/user-access-config.model';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class UserAccessConfigService {\r\n\t#config = inject(USER_ACCESS_CONFIG_TOKEN);\r\n\r\n\tgetConfiguration(): UserAccessConfig {\r\n\t\treturn this.#config;\r\n\t}\r\n}\r\n","export enum PermissionStatus {\r\n\tOK = 'OK',\r\n\tEXPIRED_SUBSCRIPTION = 'EXPIRED_SUBSCRIPTION',\r\n\tNO_SUBSCRIPTION = 'NO_SUBSCRIPTION',\r\n}\r\n","export enum DefaultPermissions {\r\n ALL = 'ALL'\r\n}","import { InjectionToken } from '@angular/core';\r\n\r\nexport const USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN = new InjectionToken('USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN');\r\n","import { Injectable } from '@angular/core';\r\nimport { KeycloakService } from 'keycloak-angular';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { UserAccessConfigService } from '../user-access-config';\r\nimport { AuthTokenParsed } from './models/auth-token-parsed.model';\r\nimport { AuthSubscription } from '@tilde-nlp/ngx-common';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class AuthService {\r\n\tauthEnabled!: boolean;\r\n\tusername: BehaviorSubject<string>;\r\n\r\n\tprivate _isAuthenticated = false;\r\n\tprivate _parsedKeycloakToken!: AuthTokenParsed;\r\n\tprivate _token!: string | undefined;\r\n\tget token() {\r\n\t\treturn this._token;\r\n\t}\r\n\r\n\tget parsedKeyCloakToken() {\r\n\t\treturn this._parsedKeycloakToken;\r\n\t}\r\n\r\n\tget isAuthRequired() {\r\n return this.config.getConfiguration().alwaysAuth;\r\n }\r\n\r\n\tconstructor(private readonly config: UserAccessConfigService, private readonly keyCloak: KeycloakService) {\r\n\t\tthis.username = new BehaviorSubject<string>('');\r\n\r\n\t\t// make jwt available in window object, so that it can be accessed everywhere (e.g. from webtranslate iframe)\r\n\t\t/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\t\t(window as any).keycloakToken = () => {\r\n\t\t\treturn this._token;\r\n\t\t};\r\n\t}\r\n\r\n\tuserSubscriptionPlan() {\r\n\t\treturn this.parsedKeyCloakToken?.subscription?.find((plan: { PlanId: string }) =>\r\n\t\t\tObject.values(this.config.getConfiguration().plans).includes(plan.PlanId)\r\n\t\t);\r\n\t}\r\n\r\n\tisAuthenticated(): boolean {\r\n\t\treturn this._isAuthenticated;\r\n\t}\r\n\r\n\tgetUserName(): string {\r\n\t\treturn this.isAuthenticated() ? this.keyCloak?.getUsername() : '';\r\n\t}\r\n\r\n\tgetUserDisplayName(): string {\r\n\t\tif (!this.authEnabled || !this._isAuthenticated) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\tlet username = this.getUserName();\r\n\r\n\t\tif (this._parsedKeycloakToken?.name) {\r\n\t\t\tusername = this.parsedKeyCloakToken.name;\r\n\t\t}\r\n\t\treturn username;\r\n\t}\r\n\r\n\tgetToken() {\r\n\t\treturn this.keyCloak.getToken();\r\n\t}\r\n\r\n\tlogout() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.keyCloak.logout(window.location.origin);\r\n\t}\r\n\r\n\tasync checkLogin() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._isAuthenticated = await this.keyCloak.isLoggedIn();\r\n\t\tthis.refreshKeycloakToken();\r\n\t\tconst username = this.getUserName();\r\n\t\tthis.username.next(username);\r\n\t}\r\n\r\n\tlogin() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.keyCloak.login();\r\n\t}\r\n\r\n\tenableAuth() {\r\n\t\tthis.authEnabled = true;\r\n\t}\r\n\r\n\trefreshKeycloakToken() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst keyCloakInstance = this.keyCloak.getKeycloakInstance();\r\n\t\t/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\t\tconst tokenParsed: AuthTokenParsed = keyCloakInstance.tokenParsed as any;\r\n\t\tthis._token = keyCloakInstance.token;\r\n\t\ttokenParsed?.subscription?.forEach((subscription: AuthSubscription) => {\r\n\t\t\t// Removes \"-Yearly\", \"-Monthly\" from end of string or -Eur- and everything that follows.\r\n\t\t\tsubscription.Label = subscription.PlanId.replace(/-Monthly$|-Yearly$|-EUR-(.*)/, '');\r\n\t\t});\r\n\t\tthis._parsedKeycloakToken = tokenParsed;\r\n\t}\r\n\r\n\tuserIsGroupMember(): boolean {\r\n\t\treturn this.parsedKeyCloakToken?.membership?.length > 0;\r\n\t}\r\n}\r\n","export enum AuthGuardParamKeys {\r\n\tREDIRECT_ROUTE = 'redirectRoute',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Router, RouterStateSnapshot, CanActivate } from '@angular/router';\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { AuthService } from './auth.service';\r\nimport { AuthGuardParamKeys } from './models/auth-guard-param-keys.enum';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class AuthGuard implements CanActivate {\r\n\tconstructor(private readonly router: Router, private readonly keycloak: KeycloakService, private readonly auth: AuthService) {}\r\n\r\n\tasync canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {\r\n\t\tif (this.auth.isAuthRequired && !this.auth.isAuthenticated()) {\r\n\t\t\t// redirectToLogin query param is more important than redirectRoute\r\n\t\t\tif (!route.queryParams?.redirectToLogin && route.data?.[AuthGuardParamKeys.REDIRECT_ROUTE]) {\r\n\t\t\t\tthis.router.navigate([route.data[AuthGuardParamKeys.REDIRECT_ROUTE]]);\r\n\t\t\t} else {\r\n\t\t\t\tawait this.keycloak.login({\r\n\t\t\t\t\tredirectUri: window.location.origin + state.url,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Clear unnecessary query param\r\n\t\tif (route.queryParams?.redirectToLogin) {\r\n\t\t\tconst queryParams = { ...route.queryParams };\r\n\t\t\tdelete queryParams.redirectToLogin;\r\n\t\t\tthis.router.navigate([state.url.split('?')[0]], { queryParams });\r\n\t\t}\r\n\r\n\t\treturn !this.auth.isAuthRequired || this.auth.isAuthenticated();\r\n\t}\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { PermissionStatus } from './models/permission-status.model';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { UserAccessConfigService } from '../user-access-config';\r\nimport { AuthService } from '../auth';\r\nimport { DefaultPermissions } from './models/default-permissions.enum';\r\nimport { PermissionsConfig } from './models/permissions-config.model';\r\nimport { USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN } from './models/user-custom-configuration-service.token';\r\nimport { UserCustomConfigurationService } from './models/user-custom-configuration-service.model';\r\nimport { DefaultSubscriptionConfig } from './models/default-subscription-config.model';\r\nimport { AuthSubscription } from '@tilde-nlp/ngx-common';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class PermissionsService<Permission, UserConfiguration> {\r\n\tuserConfiguration!: UserConfiguration;\r\n\tshowSubscriptionMessage!: boolean;\r\n\r\n\tprivate _hasOnlyUnauthorizedPermissions!: boolean;\r\n\r\n\tprivate _status!: PermissionStatus;\r\n\r\n\tprivate _permissions!: Permission[];\r\n\r\n\tprivate _expiredSubscriptions: AuthSubscription[] = [];\r\n\r\n\tprivate _expiredNotConfirmedSubscriptions: AuthSubscription[] = [];\r\n\r\n\tprivate _onPermissionRefresh = new Subject<Permission[]>();\r\n\r\n\tprivate isDebug!: boolean;\r\n\r\n\tprivate get statusLocalStorageKey() {\r\n\t\treturn this.userSpecificLocalstorageKey(this.status);\r\n\t}\r\n\r\n\tprivate get subscriptionConfig() {\r\n\t\treturn this.config.getConfiguration().subscriptions;\r\n\t}\r\n\r\n\tprivate get token() {\r\n\t\treturn this.auth.parsedKeyCloakToken;\r\n\t}\r\n\r\n\tget status() {\r\n\t\treturn this._status;\r\n\t}\r\n\tget permissions() {\r\n\t\treturn this._permissions;\r\n\t}\r\n\tget expiredSubscriptions() {\r\n\t\treturn this._expiredSubscriptions;\r\n\t}\r\n\tget expiredNotConfirmedSubscriptions() {\r\n\t\treturn this._expiredNotConfirmedSubscriptions;\r\n\t}\r\n\tget hasOnlyUnauthorizedPermissions() {\r\n\t\treturn this._hasOnlyUnauthorizedPermissions;\r\n\t}\r\n\r\n\tget onPermissionRefresh(): Observable<Permission[]> {\r\n\t\treturn this._onPermissionRefresh.asObservable();\r\n\t}\r\n\r\n\tprivate readonly SUPPORT_ROLE_KEY = 'support';\r\n\r\n\tconstructor(\r\n\t\tprivate readonly config: UserAccessConfigService,\r\n\t\tprivate readonly auth: AuthService,\r\n\t\t@Inject(USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN)\r\n\t\tprivate readonly userConfigurationService: UserCustomConfigurationService<UserConfiguration>\r\n\t) {}\r\n\r\n\t/**\r\n\t * Checks wether user has necessary permission/permissions. By default, if user has at least one of given permissions, method returns true. To check all permissions, set needsAll to true.\r\n\t * @param permissions Permissions to be checked.\r\n\t * @param needsAll If user should have all of given permissions\r\n\t * @returns\r\n\t */\r\n\thasPermission(permissions: Permission[], needsAll = false): boolean {\r\n\t\t// if user is not any group member, access should not be provided\r\n\t\tif (!this.auth.userIsGroupMember() && this.auth.userSubscriptionPlan()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!permissions || permissions.length === 0 || this.permissions.includes(DefaultPermissions.ALL as Permission)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tfor (const permission of permissions) {\r\n\t\t\tconst hasPermission = this.permissions.includes(permission);\r\n\t\t\tif (needsAll && !hasPermission) {\r\n\t\t\t\treturn false;\r\n\t\t\t} else if (!needsAll && hasPermission) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn needsAll ? true : false;\r\n\t}\r\n\r\n\tconfigurePermissions(): void {\r\n\t\tthis.isDebug = this.config.getConfiguration()?.isDebug ?? false;\r\n\r\n\t\tthis.userConfiguration = {} as UserConfiguration;\r\n\t\tthis._status = PermissionStatus.OK;\r\n\r\n\t\tlet allPermissions: Permission[] | undefined = [];\r\n\t\tconst expiredSubscriptions: AuthSubscription[] = [];\r\n\r\n\t\tallPermissions = this.refreshAllPermissionsForUser();\r\n\r\n\t\tif (new Date() > new Date(this.auth.userSubscriptionPlan()?.EndDate as string)) {\r\n\t\t\texpiredSubscriptions.push(this.auth.userSubscriptionPlan() as AuthSubscription);\r\n\t\t}\r\n\r\n\t\tthis.setPermissions(allPermissions as Permission[]);\r\n\t\tthis._expiredSubscriptions = expiredSubscriptions;\r\n\t\tif (this.isDebug) {\r\n\t\t\t// eslint-disable-next-line no-console\r\n\t\t\tconsole.log('permissions', this.permissions);\r\n\t\t\t// eslint-disable-next-line no-console\r\n\t\t\tconsole.log('userConfig', this.userConfiguration);\r\n\t\t}\r\n\t\tthis.shouldShowMessage();\r\n\t}\r\n\r\n\tconfirmMessage() {\r\n\t\tconst localStorageKey = this.statusLocalStorageKey;\r\n\t\tif (this.status === PermissionStatus.NO_SUBSCRIPTION) {\r\n\t\t\tlocalStorage.setItem(localStorageKey, `true`);\r\n\t\t} else if (this.status === PermissionStatus.EXPIRED_SUBSCRIPTION) {\r\n\t\t\tconst confirmed = JSON.parse(localStorage.getItem(localStorageKey) as string) ?? {};\r\n\t\t\tthis.expiredNotConfirmedSubscriptions.forEach((subscription) => {\r\n\t\t\t\tconfirmed[subscription.PlanId] = new Date().toString();\r\n\t\t\t});\r\n\t\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(confirmed));\r\n\t\t}\r\n\t\tthis.showSubscriptionMessage = false;\r\n\t}\r\n\r\n\tuserSpecificLocalstorageKey(key: string) {\r\n\t\treturn this.hashString(`${key}_${this.auth.getUserName().toUpperCase()}`);\r\n\t}\r\n\r\n\tprivate refreshAllPermissionsForUser() {\r\n\t\t// We should ignore subscription permissions for Supports.\r\n\t\treturn this.isSupport()\r\n\t\t\t? this.checkRolePermissions()\r\n\t\t\t: this.checkSubscriptionPermissions().concat(this.checkRolePermissions() as Permission[]);\r\n\t}\r\n\r\n\tprivate checkSubscriptionPermissions(): Permission[] {\r\n\t\tconst subscriptionConfig = this.subscriptionConfig;\r\n\t\tconst allPermissions = subscriptionConfig.plans;\r\n\t\tconst token = this.token;\r\n\t\tconst isAuthenticated = this.auth.isAuthenticated();\r\n\r\n\t\tlet permissions: Permission[] = [];\r\n\r\n\t\tif (isAuthenticated && !subscriptionConfig.ignoreSubscriptions) {\r\n\t\t\tlet hasAnySubscription = false;\r\n\t\t\tif (token?.subscription) {\r\n\t\t\t\tfor (const plan of token.subscription) {\r\n\t\t\t\t\tconst permissionConfig = this.findPermissionConfig(allPermissions, plan.Label as string);\r\n\t\t\t\t\tif (!this.isPlanActive(plan) && this.isSupportedPlan(plan)) {\r\n\t\t\t\t\t\tif (permissionConfig) {\r\n\t\t\t\t\t\t\thasAnySubscription = true;\r\n\t\t\t\t\t\t\tthis._status = PermissionStatus.EXPIRED_SUBSCRIPTION;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.isPlanActive(plan) && this.isSupportedPlan(plan) && permissionConfig) {\r\n\t\t\t\t\t\thasAnySubscription = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (permissionConfig?.permissions) {\r\n\t\t\t\t\t\tpermissionConfig.permissions.forEach((permission) => {\r\n\t\t\t\t\t\t\tif (!permissions.includes(permission)) {\r\n\t\t\t\t\t\t\t\tpermissions.push(permission);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (permissionConfig?.userConfiguration) {\r\n\t\t\t\t\t\tthis.updateUserConfiguration(permissionConfig.userConfiguration);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!hasAnySubscription) {\r\n\t\t\t\tthis._status = PermissionStatus.NO_SUBSCRIPTION;\r\n\t\t\t}\r\n\t\t} else if (subscriptionConfig.ignoreSubscriptions && this.isDebug) {\r\n\t\t\tconsole.warn(\r\n\t\t\t\t'You are ignoring subscriptions, which means that your permissions might not work as expected. This option might be set in config.local.debug.json for easier testing.'\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// if has no permissions, use default permissions\r\n\t\tif (permissions.length === 0) {\r\n\t\t\tconst defaultPlanName = this.findDefaultPlanName(subscriptionConfig, isAuthenticated);\r\n\t\t\tconst permissionConfig = this.findPermissionConfig(allPermissions, defaultPlanName);\r\n\r\n\t\t\tpermissions = permissionConfig?.permissions ?? [];\r\n\t\t\tthis.updateUserConfiguration(permissionConfig?.userConfiguration as UserConfiguration);\r\n\t\t\tif (!subscriptionConfig.ignoreSubscriptions) {\r\n\t\t\t\tthis._hasOnlyUnauthorizedPermissions = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn permissions;\r\n\t}\r\n\r\n\tprivate checkRolePermissions(): Permission[] | undefined {\r\n\t\tconst subscriptionConfig = this.subscriptionConfig;\r\n\t\tconst token = this.token;\r\n\t\tlet permissions: Permission[] = [];\r\n\r\n\t\tconst roles = token?.realm_access?.roles;\r\n\r\n\t\t// if no roles for user or no permissions defined for roles, return empty array.\r\n\t\tif (!roles?.length || !subscriptionConfig.roles?.length) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tif (this.isSupport()) {\r\n\t\t\treturn this.findPermissionConfig(subscriptionConfig.roles, this.SUPPORT_ROLE_KEY)?.permissions;\r\n\t\t}\r\n\r\n\t\troles.forEach((role) => {\r\n\t\t\tconst rolePermissionConfig = this.findPermissionConfig(subscriptionConfig.roles, role);\r\n\t\t\tif (rolePermissionConfig) {\r\n\t\t\t\tpermissions = permissions.concat(rolePermissionConfig.permissions as Permission[]);\r\n\t\t\t\tthis.updateUserConfiguration(rolePermissionConfig.userConfiguration);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn permissions;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates current user configuration object with values that gives more permissions (bigger limits) to the user.\r\n\t * @param userConfiguration User configuration object to be compared with current userconfig object\r\n\t */\r\n\tprivate updateUserConfiguration(userConfiguration: UserConfiguration) {\r\n\t\tif (!userConfiguration) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.userConfiguration = this.userConfigurationService.updateUserConfiguration(this.userConfiguration, userConfiguration);\r\n\t}\r\n\r\n\tprivate shouldShowMessage() {\r\n\t\tconst localStorageValue = localStorage.getItem(this.statusLocalStorageKey);\r\n\t\tif (this.status === PermissionStatus.NO_SUBSCRIPTION) {\r\n\t\t\tthis.showSubscriptionMessage = localStorageValue ? false : true;\r\n\t\t} else if (this.status === PermissionStatus.EXPIRED_SUBSCRIPTION) {\r\n\t\t\tconst confirmed = JSON.parse(localStorageValue as string);\r\n\t\t\tif (!confirmed) {\r\n\t\t\t\tthis._expiredNotConfirmedSubscriptions = this.expiredSubscriptions;\r\n\t\t\t\tthis.showSubscriptionMessage = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst notConfirmedExpired = [];\r\n\t\t\tfor (const subscription of this.expiredSubscriptions) {\r\n\t\t\t\tif (confirmed[subscription.PlanId] && new Date() > new Date(subscription.EndDate as string)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tnotConfirmedExpired.push(subscription);\r\n\t\t\t\tthis.showSubscriptionMessage = true;\r\n\t\t\t}\r\n\t\t\tthis._expiredNotConfirmedSubscriptions = notConfirmedExpired;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate isPlanActive(plan: AuthSubscription) {\r\n\t\tif (!plan.EndDate || new Date() < new Date(plan.EndDate)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isSupportedPlan(plan: AuthSubscription) {\r\n\t\tconst planLabels = Object.values(this.config.getConfiguration().plans) as string[];\r\n\r\n\t\tif (planLabels.includes(plan.Label as string)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Finds permission config in array based on given key\r\n\t * @param permissions permission array where to find config from\r\n\t * @param key object identification key\r\n\t * @returns permission config\r\n\t */\r\n\tprivate findPermissionConfig(\r\n\t\tpermissions: PermissionsConfig<Permission, UserConfiguration>[],\r\n\t\tkey: string\r\n\t): PermissionsConfig<Permission, UserConfiguration> | null {\r\n\t\tfor (const permission of permissions) {\r\n\t\t\tif (permission.keys.includes(key)) {\r\n\t\t\t\treturn permission;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// for storing user specific info in localstorage;\r\n\tprivate hashString(username: string) {\r\n\t\tlet hash = 0;\r\n\t\tif (username.length > 0) {\r\n\t\t\tfor (let i = 0; i < username.length; i++) {\r\n\t\t\t\tconst char = username.charCodeAt(i);\r\n\t\t\t\thash = (hash << 5) - hash + char;\r\n\t\t\t\thash = hash & hash; // Convert to 32bit integer\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn hash.toString();\r\n\t}\r\n\r\n\tprivate findDefaultPlanName(config: DefaultSubscriptionConfig, isAuthenticated: boolean): string {\r\n\t\tlet defaultPlanName;\r\n\t\tif (isAuthenticated) {\r\n\t\t\tif (this.status === PermissionStatus.EXPIRED_SUBSCRIPTION) {\r\n\t\t\t\tdefaultPlanName = config.expiredPermissionsPlanName || config.defaultPlanName;\r\n\t\t\t} else {\r\n\t\t\t\tdefaultPlanName = config.defaultPlanName;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn defaultPlanName || (config.unauthorizedDefaultPermissionPlan as string);\r\n\t}\r\n\r\n\tprivate setPermissions(permissions: Permission[]) {\r\n\t\tthis._permissions = permissions;\r\n\t\tthis._onPermissionRefresh.next(this._permissions);\r\n\t}\r\n\r\n\tprivate isSupport(): boolean {\r\n\t\treturn this.token?.realm_access?.roles?.includes(this.SUPPORT_ROLE_KEY);\r\n\t}\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { KeycloakEventTypeLegacy, KeycloakService } from 'keycloak-angular';\r\nimport { UserAccessConfigService } from '../user-access-config';\r\nimport { PermissionsService } from '../permissions';\r\nimport { AuthService } from '../auth';\r\n\r\nexport async function KEYCLOAK_INITIALIZER() {\r\n\tconst keycloak = inject(KeycloakService);\r\n\tconst config = inject(UserAccessConfigService);\r\n\tconst permissions = inject(PermissionsService);\r\n\tconst auth = inject(AuthService);\r\n\r\n\tawait keycloak\r\n\t\t.init({\r\n\t\t\tconfig: config.getConfiguration().keycloak,\r\n\t\t\tenableBearerInterceptor: false,\r\n\t\t\tloadUserProfileAtStartUp: true,\r\n\t\t\tinitOptions: {\r\n\t\t\t\tonLoad: 'check-sso',\r\n\t\t\t\tsilentCheckSsoRedirectUri: window.location.origin + '/assets/auth/silent-check-sso.html',\r\n\t\t\t\tredirectUri: window.location.origin,\r\n\t\t\t},\r\n\t\t\tbearerExcludedUrls: config.getConfiguration().keycloak.bearerExcludedUrls,\r\n\t\t})\r\n\t\t.catch((error) => {\r\n\t\t\tconsole.error(error);\r\n\t\t\tpermissions.configurePermissions();\r\n\t\t\treturn;\r\n\t\t});\r\n\r\n\tauth.enableAuth();\r\n\tawait auth.checkLogin();\r\n\t\r\n\tpermissions.configurePermissions();\r\n\r\n\tkeycloak.keycloakEvents$.subscribe((ev) => {\r\n\t\tif (ev.type == KeycloakEventTypeLegacy.OnTokenExpired) {\r\n\t\t\tconst minValidity = 5;\r\n\t\t\tif (keycloak.isTokenExpired(minValidity)) {\r\n\t\t\t\tkeycloak.updateToken(minValidity).then(\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tauth.refreshKeycloakToken();\r\n\t\t\t\t\t\tpermissions.configurePermissions();\r\n\t\t\t\t\t},\r\n\t\t\t\t\t(err) => {\r\n\t\t\t\t\t\tconsole.error('Token refresh failed', err);\r\n\t\t\t\t\t\tkeycloak.login();\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n","import { KeycloakBearerInterceptor, KeycloakService } from 'keycloak-angular';\r\nimport { KEYCLOAK_INITIALIZER } from './keycloak.initializer';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\n\r\nexport async function KEYCLOAK_PROVIDER() {\r\n\treturn [\r\n\t\tKeycloakService,\r\n\t\t{\r\n\t\t\tprovide: HTTP_INTERCEPTORS,\r\n\t\t\tuseClass: KeycloakBearerInterceptor,\r\n\t\t\tdeps: [KeycloakService],\r\n\t\t\tmulti: true,\r\n\t\t},\r\n\t\tawait KEYCLOAK_INITIALIZER(),\r\n\t];\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UserAccessConfigService","i3.AuthService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tilde-nlp-ngx-user-access.mjs","sources":["../../../projects/ngx-user-access/src/lib/user-access-config/tokens/user-access-config,.token.ts","../../../projects/ngx-user-access/src/lib/user-access-config/user-access-config.service.ts","../../../projects/ngx-user-access/src/lib/permissions/models/permission-status.model.ts","../../../projects/ngx-user-access/src/lib/permissions/models/default-permissions.enum.ts","../../../projects/ngx-user-access/src/lib/auth/auth.service.ts","../../../projects/ngx-user-access/src/lib/auth/models/auth-guard-param-keys.enum.ts","../../../projects/ngx-user-access/src/lib/auth/auth.guard.ts","../../../projects/ngx-user-access/src/lib/permissions/user-configuration.service.ts","../../../projects/ngx-user-access/src/lib/permissions/permissions.service.ts","../../../projects/ngx-user-access/src/lib/keycloak/keycloak.initializer.ts","../../../projects/ngx-user-access/src/lib/keycloak/keycloak.provider.ts","../../../projects/ngx-user-access/src/tilde-nlp-ngx-user-access.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { UserAccessConfig } from '../models/user-access-config.model';\r\n\r\nexport const USER_ACCESS_CONFIG_TOKEN = new InjectionToken<UserAccessConfig>('USER_ACCESS_CONFIG_TOKEN');\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { USER_ACCESS_CONFIG_TOKEN } from './tokens/user-access-config,.token';\r\nimport { UserAccessConfig } from './models/user-access-config.model';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class UserAccessConfigService {\r\n\t#config = inject(USER_ACCESS_CONFIG_TOKEN);\r\n\r\n\tgetConfiguration(): UserAccessConfig {\r\n\t\treturn this.#config;\r\n\t}\r\n}\r\n","export enum PermissionStatus {\r\n\tOK = 'OK',\r\n\tEXPIRED_SUBSCRIPTION = 'EXPIRED_SUBSCRIPTION',\r\n\tNO_SUBSCRIPTION = 'NO_SUBSCRIPTION',\r\n}\r\n","export enum DefaultPermissions {\r\n ALL = 'ALL'\r\n}","import { Injectable } from '@angular/core';\r\nimport { KeycloakService } from 'keycloak-angular';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { UserAccessConfigService } from '../user-access-config';\r\nimport { AuthTokenParsed } from './models/auth-token-parsed.model';\r\nimport { AuthSubscription } from '@tilde-nlp/ngx-common';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class AuthService {\r\n\tauthEnabled!: boolean;\r\n\tusername: BehaviorSubject<string>;\r\n\r\n\tprivate _isAuthenticated = false;\r\n\tprivate _parsedKeycloakToken!: AuthTokenParsed;\r\n\tprivate _token!: string | undefined;\r\n\tget token() {\r\n\t\treturn this._token;\r\n\t}\r\n\r\n\tget parsedKeyCloakToken() {\r\n\t\treturn this._parsedKeycloakToken;\r\n\t}\r\n\r\n\tget isAuthRequired() {\r\n return this.config.getConfiguration().alwaysAuth;\r\n }\r\n\r\n\tconstructor(private readonly config: UserAccessConfigService, private readonly keyCloak: KeycloakService) {\r\n\t\tthis.username = new BehaviorSubject<string>('');\r\n\r\n\t\t// make jwt available in window object, so that it can be accessed everywhere (e.g. from webtranslate iframe)\r\n\t\t/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\t\t(window as any).keycloakToken = () => {\r\n\t\t\treturn this._token;\r\n\t\t};\r\n\t}\r\n\r\n\tuserSubscriptionPlan() {\r\n\t\treturn this.parsedKeyCloakToken?.subscription?.find((plan: { PlanId: string }) =>\r\n\t\t\tObject.values(this.config.getConfiguration().plans).includes(plan.PlanId)\r\n\t\t);\r\n\t}\r\n\r\n\tisAuthenticated(): boolean {\r\n\t\treturn this._isAuthenticated;\r\n\t}\r\n\r\n\tgetUserName(): string {\r\n\t\treturn this.isAuthenticated() ? this.keyCloak?.getUsername() : '';\r\n\t}\r\n\r\n\tgetUserDisplayName(): string {\r\n\t\tif (!this.authEnabled || !this._isAuthenticated) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\tlet username = this.getUserName();\r\n\r\n\t\tif (this._parsedKeycloakToken?.name) {\r\n\t\t\tusername = this.parsedKeyCloakToken.name;\r\n\t\t}\r\n\t\treturn username;\r\n\t}\r\n\r\n\tgetToken() {\r\n\t\treturn this.keyCloak.getToken();\r\n\t}\r\n\r\n\tlogout() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.keyCloak.logout(window.location.origin);\r\n\t}\r\n\r\n\tasync checkLogin() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._isAuthenticated = await this.keyCloak.isLoggedIn();\r\n\t\tthis.refreshKeycloakToken();\r\n\t\tconst username = this.getUserName();\r\n\t\tthis.username.next(username);\r\n\t}\r\n\r\n\tlogin() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.keyCloak.login();\r\n\t}\r\n\r\n\tenableAuth() {\r\n\t\tthis.authEnabled = true;\r\n\t}\r\n\r\n\trefreshKeycloakToken() {\r\n\t\tif (!this.authEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst keyCloakInstance = this.keyCloak.getKeycloakInstance();\r\n\t\t/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\t\tconst tokenParsed: AuthTokenParsed = keyCloakInstance.tokenParsed as any;\r\n\t\tthis._token = keyCloakInstance.token;\r\n\t\ttokenParsed?.subscription?.forEach((subscription: AuthSubscription) => {\r\n\t\t\t// Removes \"-Yearly\", \"-Monthly\" from end of string or -Eur- and everything that follows.\r\n\t\t\tsubscription.Label = subscription.PlanId.replace(/-Monthly$|-Yearly$|-EUR-(.*)/, '');\r\n\t\t});\r\n\t\tthis._parsedKeycloakToken = tokenParsed;\r\n\t}\r\n\r\n\tuserIsGroupMember(): boolean {\r\n\t\treturn this.parsedKeyCloakToken?.membership?.length > 0;\r\n\t}\r\n}\r\n","export enum AuthGuardParamKeys {\r\n\tREDIRECT_ROUTE = 'redirectRoute',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Router, RouterStateSnapshot, CanActivate } from '@angular/router';\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { AuthService } from './auth.service';\r\nimport { AuthGuardParamKeys } from './models/auth-guard-param-keys.enum';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class AuthGuard implements CanActivate {\r\n\tconstructor(private readonly router: Router, private readonly keycloak: KeycloakService, private readonly auth: AuthService) {}\r\n\r\n\tasync canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {\r\n\t\tif (this.auth.isAuthRequired && !this.auth.isAuthenticated()) {\r\n\t\t\t// redirectToLogin query param is more important than redirectRoute\r\n\t\t\tif (!route.queryParams?.redirectToLogin && route.data?.[AuthGuardParamKeys.REDIRECT_ROUTE]) {\r\n\t\t\t\tthis.router.navigate([route.data[AuthGuardParamKeys.REDIRECT_ROUTE]]);\r\n\t\t\t} else {\r\n\t\t\t\tawait this.keycloak.login({\r\n\t\t\t\t\tredirectUri: window.location.origin + state.url,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Clear unnecessary query param\r\n\t\tif (route.queryParams?.redirectToLogin) {\r\n\t\t\tconst queryParams = { ...route.queryParams };\r\n\t\t\tdelete queryParams.redirectToLogin;\r\n\t\t\tthis.router.navigate([state.url.split('?')[0]], { queryParams });\r\n\t\t}\r\n\r\n\t\treturn !this.auth.isAuthRequired || this.auth.isAuthenticated();\r\n\t}\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UserCustomConfiguration } from './models';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class UserConfigurationService<T> implements UserCustomConfiguration<T> {\r\n\t/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\tupdateUserConfiguration(_currentConfiguration: T, _newConfiguration: T): T {\r\n\t\tconst configuration: T = {} as T;\r\n\r\n\t\treturn configuration;\r\n\t}\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { PermissionStatus } from './models/permission-status.model';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { UserAccessConfigService } from '../user-access-config';\r\nimport { AuthService } from '../auth';\r\nimport { DefaultPermissions } from './models/default-permissions.enum';\r\nimport { PermissionsConfig } from './models/permissions-config.model';\r\nimport { DefaultSubscriptionConfig } from './models/default-subscription-config.model';\r\nimport { AuthSubscription } from '@tilde-nlp/ngx-common';\r\nimport { UserConfigurationService } from './user-configuration.service';\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class PermissionsService<Permission, UserConfiguration> {\r\n\tuserConfiguration!: UserConfiguration;\r\n\tshowSubscriptionMessage!: boolean;\r\n\r\n\tprivate _hasOnlyUnauthorizedPermissions!: boolean;\r\n\r\n\tprivate _status!: PermissionStatus;\r\n\r\n\tprivate _permissions!: Permission[];\r\n\r\n\tprivate _expiredSubscriptions: AuthSubscription[] = [];\r\n\r\n\tprivate _expiredNotConfirmedSubscriptions: AuthSubscription[] = [];\r\n\r\n\tprivate _onPermissionRefresh = new Subject<Permission[]>();\r\n\r\n\tprivate isDebug!: boolean;\r\n\r\n\tprivate get statusLocalStorageKey() {\r\n\t\treturn this.userSpecificLocalstorageKey(this.status);\r\n\t}\r\n\r\n\tprivate get subscriptionConfig() {\r\n\t\treturn this.config.getConfiguration().subscriptions;\r\n\t}\r\n\r\n\tprivate get token() {\r\n\t\treturn this.auth.parsedKeyCloakToken;\r\n\t}\r\n\r\n\tget status() {\r\n\t\treturn this._status;\r\n\t}\r\n\tget permissions() {\r\n\t\treturn this._permissions;\r\n\t}\r\n\tget expiredSubscriptions() {\r\n\t\treturn this._expiredSubscriptions;\r\n\t}\r\n\tget expiredNotConfirmedSubscriptions() {\r\n\t\treturn this._expiredNotConfirmedSubscriptions;\r\n\t}\r\n\tget hasOnlyUnauthorizedPermissions() {\r\n\t\treturn this._hasOnlyUnauthorizedPermissions;\r\n\t}\r\n\r\n\tget onPermissionRefresh(): Observable<Permission[]> {\r\n\t\treturn this._onPermissionRefresh.asObservable();\r\n\t}\r\n\r\n\tprivate readonly SUPPORT_ROLE_KEY = 'support';\r\n\r\n\tconstructor(\r\n\t\tprivate readonly config: UserAccessConfigService,\r\n\t\tprivate readonly auth: AuthService,\r\n\t\tprivate readonly userConfigurationService: UserConfigurationService<UserConfiguration>\r\n\t) {}\r\n\r\n\t/**\r\n\t * Checks wether user has necessary permission/permissions. By default, if user has at least one of given permissions, method returns true. To check all permissions, set needsAll to true.\r\n\t * @param permissions Permissions to be checked.\r\n\t * @param needsAll If user should have all of given permissions\r\n\t * @returns\r\n\t */\r\n\thasPermission(permissions: Permission[], needsAll = false): boolean {\r\n\t\t// if user is not any group member, access should not be provided\r\n\t\tif (!this.auth.userIsGroupMember() && this.auth.userSubscriptionPlan()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!permissions || permissions.length === 0 || this.permissions.includes(DefaultPermissions.ALL as Permission)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tfor (const permission of permissions) {\r\n\t\t\tconst hasPermission = this.permissions.includes(permission);\r\n\t\t\tif (needsAll && !hasPermission) {\r\n\t\t\t\treturn false;\r\n\t\t\t} else if (!needsAll && hasPermission) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn needsAll ? true : false;\r\n\t}\r\n\r\n\tconfigurePermissions(): void {\r\n\t\tthis.isDebug = this.config.getConfiguration()?.isDebug ?? false;\r\n\r\n\t\tthis.userConfiguration = {} as UserConfiguration;\r\n\t\tthis._status = PermissionStatus.OK;\r\n\r\n\t\tlet allPermissions: Permission[] | undefined = [];\r\n\t\tconst expiredSubscriptions: AuthSubscription[] = [];\r\n\r\n\t\tallPermissions = this.refreshAllPermissionsForUser();\r\n\r\n\t\tif (new Date() > new Date(this.auth.userSubscriptionPlan()?.EndDate as string)) {\r\n\t\t\texpiredSubscriptions.push(this.auth.userSubscriptionPlan() as AuthSubscription);\r\n\t\t}\r\n\r\n\t\tthis.setPermissions(allPermissions as Permission[]);\r\n\t\tthis._expiredSubscriptions = expiredSubscriptions;\r\n\t\tif (this.isDebug) {\r\n\t\t\t// eslint-disable-next-line no-console\r\n\t\t\tconsole.log('permissions', this.permissions);\r\n\t\t\t// eslint-disable-next-line no-console\r\n\t\t\tconsole.log('userConfig', this.userConfiguration);\r\n\t\t}\r\n\t\tthis.shouldShowMessage();\r\n\t}\r\n\r\n\tconfirmMessage() {\r\n\t\tconst localStorageKey = this.statusLocalStorageKey;\r\n\t\tif (this.status === PermissionStatus.NO_SUBSCRIPTION) {\r\n\t\t\tlocalStorage.setItem(localStorageKey, `true`);\r\n\t\t} else if (this.status === PermissionStatus.EXPIRED_SUBSCRIPTION) {\r\n\t\t\tconst confirmed = JSON.parse(localStorage.getItem(localStorageKey) as string) ?? {};\r\n\t\t\tthis.expiredNotConfirmedSubscriptions.forEach((subscription) => {\r\n\t\t\t\tconfirmed[subscription.PlanId] = new Date().toString();\r\n\t\t\t});\r\n\t\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(confirmed));\r\n\t\t}\r\n\t\tthis.showSubscriptionMessage = false;\r\n\t}\r\n\r\n\tuserSpecificLocalstorageKey(key: string) {\r\n\t\treturn this.hashString(`${key}_${this.auth.getUserName().toUpperCase()}`);\r\n\t}\r\n\r\n\tprivate refreshAllPermissionsForUser() {\r\n\t\t// We should ignore subscription permissions for Supports.\r\n\t\treturn this.isSupport()\r\n\t\t\t? this.checkRolePermissions()\r\n\t\t\t: this.checkSubscriptionPermissions().concat(this.checkRolePermissions() as Permission[]);\r\n\t}\r\n\r\n\tprivate checkSubscriptionPermissions(): Permission[] {\r\n\t\tconst subscriptionConfig = this.subscriptionConfig;\r\n\t\tconst allPermissions = subscriptionConfig.plans;\r\n\t\tconst token = this.token;\r\n\t\tconst isAuthenticated = this.auth.isAuthenticated();\r\n\r\n\t\tlet permissions: Permission[] = [];\r\n\r\n\t\tif (isAuthenticated && !subscriptionConfig.ignoreSubscriptions) {\r\n\t\t\tlet hasAnySubscription = false;\r\n\t\t\tif (token?.subscription) {\r\n\t\t\t\tfor (const plan of token.subscription) {\r\n\t\t\t\t\tconst permissionConfig = this.findPermissionConfig(allPermissions, plan.Label as string);\r\n\t\t\t\t\tif (!this.isPlanActive(plan) && this.isSupportedPlan(plan)) {\r\n\t\t\t\t\t\tif (permissionConfig) {\r\n\t\t\t\t\t\t\thasAnySubscription = true;\r\n\t\t\t\t\t\t\tthis._status = PermissionStatus.EXPIRED_SUBSCRIPTION;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.isPlanActive(plan) && this.isSupportedPlan(plan) && permissionConfig) {\r\n\t\t\t\t\t\thasAnySubscription = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (permissionConfig?.permissions) {\r\n\t\t\t\t\t\tpermissionConfig.permissions.forEach((permission) => {\r\n\t\t\t\t\t\t\tif (!permissions.includes(permission)) {\r\n\t\t\t\t\t\t\t\tpermissions.push(permission);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (permissionConfig?.userConfiguration) {\r\n\t\t\t\t\t\tthis.updateUserConfiguration(permissionConfig.userConfiguration);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!hasAnySubscription) {\r\n\t\t\t\tthis._status = PermissionStatus.NO_SUBSCRIPTION;\r\n\t\t\t}\r\n\t\t} else if (subscriptionConfig.ignoreSubscriptions && this.isDebug) {\r\n\t\t\tconsole.warn(\r\n\t\t\t\t'You are ignoring subscriptions, which means that your permissions might not work as expected. This option might be set in config.local.debug.json for easier testing.'\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// if has no permissions, use default permissions\r\n\t\tif (permissions.length === 0) {\r\n\t\t\tconst defaultPlanName = this.findDefaultPlanName(subscriptionConfig, isAuthenticated);\r\n\t\t\tconst permissionConfig = this.findPermissionConfig(allPermissions, defaultPlanName);\r\n\r\n\t\t\tpermissions = permissionConfig?.permissions ?? [];\r\n\t\t\tthis.updateUserConfiguration(permissionConfig?.userConfiguration as UserConfiguration);\r\n\t\t\tif (!subscriptionConfig.ignoreSubscriptions) {\r\n\t\t\t\tthis._hasOnlyUnauthorizedPermissions = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn permissions;\r\n\t}\r\n\r\n\tprivate checkRolePermissions(): Permission[] | undefined {\r\n\t\tconst subscriptionConfig = this.subscriptionConfig;\r\n\t\tconst token = this.token;\r\n\t\tlet permissions: Permission[] = [];\r\n\r\n\t\tconst roles = token?.realm_access?.roles;\r\n\r\n\t\t// if no roles for user or no permissions defined for roles, return empty array.\r\n\t\tif (!roles?.length || !subscriptionConfig.roles?.length) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tif (this.isSupport()) {\r\n\t\t\treturn this.findPermissionConfig(subscriptionConfig.roles, this.SUPPORT_ROLE_KEY)?.permissions;\r\n\t\t}\r\n\r\n\t\troles.forEach((role) => {\r\n\t\t\tconst rolePermissionConfig = this.findPermissionConfig(subscriptionConfig.roles, role);\r\n\t\t\tif (rolePermissionConfig) {\r\n\t\t\t\tpermissions = permissions.concat(rolePermissionConfig.permissions as Permission[]);\r\n\t\t\t\tthis.updateUserConfiguration(rolePermissionConfig.userConfiguration);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn permissions;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates current user configuration object with values that gives more permissions (bigger limits) to the user.\r\n\t * @param userConfiguration User configuration object to be compared with current userconfig object\r\n\t */\r\n\tprivate updateUserConfiguration(userConfiguration: UserConfiguration) {\r\n\t\tif (!userConfiguration) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.userConfiguration = this.userConfigurationService.updateUserConfiguration(this.userConfiguration, userConfiguration);\r\n\t}\r\n\r\n\tprivate shouldShowMessage() {\r\n\t\tconst localStorageValue = localStorage.getItem(this.statusLocalStorageKey);\r\n\t\tif (this.status === PermissionStatus.NO_SUBSCRIPTION) {\r\n\t\t\tthis.showSubscriptionMessage = localStorageValue ? false : true;\r\n\t\t} else if (this.status === PermissionStatus.EXPIRED_SUBSCRIPTION) {\r\n\t\t\tconst confirmed = JSON.parse(localStorageValue as string);\r\n\t\t\tif (!confirmed) {\r\n\t\t\t\tthis._expiredNotConfirmedSubscriptions = this.expiredSubscriptions;\r\n\t\t\t\tthis.showSubscriptionMessage = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst notConfirmedExpired = [];\r\n\t\t\tfor (const subscription of this.expiredSubscriptions) {\r\n\t\t\t\tif (confirmed[subscription.PlanId] && new Date() > new Date(subscription.EndDate as string)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tnotConfirmedExpired.push(subscription);\r\n\t\t\t\tthis.showSubscriptionMessage = true;\r\n\t\t\t}\r\n\t\t\tthis._expiredNotConfirmedSubscriptions = notConfirmedExpired;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate isPlanActive(plan: AuthSubscription) {\r\n\t\tif (!plan.EndDate || new Date() < new Date(plan.EndDate)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isSupportedPlan(plan: AuthSubscription) {\r\n\t\tconst planLabels = Object.values(this.config.getConfiguration().plans) as string[];\r\n\r\n\t\tif (planLabels.includes(plan.Label as string)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Finds permission config in array based on given key\r\n\t * @param permissions permission array where to find config from\r\n\t * @param key object identification key\r\n\t * @returns permission config\r\n\t */\r\n\tprivate findPermissionConfig(\r\n\t\tpermissions: PermissionsConfig<Permission, UserConfiguration>[],\r\n\t\tkey: string\r\n\t): PermissionsConfig<Permission, UserConfiguration> | null {\r\n\t\tfor (const permission of permissions) {\r\n\t\t\tif (permission.keys.includes(key)) {\r\n\t\t\t\treturn permission;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// for storing user specific info in localstorage;\r\n\tprivate hashString(username: string) {\r\n\t\tlet hash = 0;\r\n\t\tif (username.length > 0) {\r\n\t\t\tfor (let i = 0; i < username.length; i++) {\r\n\t\t\t\tconst char = username.charCodeAt(i);\r\n\t\t\t\thash = (hash << 5) - hash + char;\r\n\t\t\t\thash = hash & hash; // Convert to 32bit integer\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn hash.toString();\r\n\t}\r\n\r\n\tprivate findDefaultPlanName(config: DefaultSubscriptionConfig, isAuthenticated: boolean): string {\r\n\t\tlet defaultPlanName;\r\n\t\tif (isAuthenticated) {\r\n\t\t\tif (this.status === PermissionStatus.EXPIRED_SUBSCRIPTION) {\r\n\t\t\t\tdefaultPlanName = config.expiredPermissionsPlanName || config.defaultPlanName;\r\n\t\t\t} else {\r\n\t\t\t\tdefaultPlanName = config.defaultPlanName;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn defaultPlanName || (config.unauthorizedDefaultPermissionPlan as string);\r\n\t}\r\n\r\n\tprivate setPermissions(permissions: Permission[]) {\r\n\t\tthis._permissions = permissions;\r\n\t\tthis._onPermissionRefresh.next(this._permissions);\r\n\t}\r\n\r\n\tprivate isSupport(): boolean {\r\n\t\treturn this.token?.realm_access?.roles?.includes(this.SUPPORT_ROLE_KEY);\r\n\t}\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { KeycloakEventTypeLegacy, KeycloakService } from 'keycloak-angular';\r\nimport { UserAccessConfigService } from '../user-access-config';\r\nimport { PermissionsService } from '../permissions';\r\nimport { AuthService } from '../auth';\r\n\r\nexport async function KEYCLOAK_INITIALIZER() {\r\n\tconst keycloak = inject(KeycloakService);\r\n\tconst config = inject(UserAccessConfigService);\r\n\tconst permissions = inject(PermissionsService);\r\n\tconst auth = inject(AuthService);\r\n\r\n\tawait keycloak\r\n\t\t.init({\r\n\t\t\tconfig: config.getConfiguration().keycloak,\r\n\t\t\tenableBearerInterceptor: false,\r\n\t\t\tloadUserProfileAtStartUp: true,\r\n\t\t\tinitOptions: {\r\n\t\t\t\tonLoad: 'check-sso',\r\n\t\t\t\tsilentCheckSsoRedirectUri: window.location.origin + '/assets/auth/silent-check-sso.html',\r\n\t\t\t\tredirectUri: window.location.origin,\r\n\t\t\t},\r\n\t\t\tbearerExcludedUrls: config.getConfiguration().keycloak.bearerExcludedUrls,\r\n\t\t})\r\n\t\t.catch((error) => {\r\n\t\t\tconsole.error(error);\r\n\t\t\tpermissions.configurePermissions();\r\n\t\t\treturn;\r\n\t\t});\r\n\r\n\tauth.enableAuth();\r\n\tawait auth.checkLogin();\r\n\t\r\n\tpermissions.configurePermissions();\r\n\r\n\tkeycloak.keycloakEvents$.subscribe((ev) => {\r\n\t\tif (ev.type == KeycloakEventTypeLegacy.OnTokenExpired) {\r\n\t\t\tconst minValidity = 5;\r\n\t\t\tif (keycloak.isTokenExpired(minValidity)) {\r\n\t\t\t\tkeycloak.updateToken(minValidity).then(\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tauth.refreshKeycloakToken();\r\n\t\t\t\t\t\tpermissions.configurePermissions();\r\n\t\t\t\t\t},\r\n\t\t\t\t\t(err) => {\r\n\t\t\t\t\t\tconsole.error('Token refresh failed', err);\r\n\t\t\t\t\t\tkeycloak.login();\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n","import { KeycloakBearerInterceptor, KeycloakService } from 'keycloak-angular';\r\nimport { KEYCLOAK_INITIALIZER } from './keycloak.initializer';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\n\r\nexport async function KEYCLOAK_PROVIDER() {\r\n\treturn [\r\n\t\tKeycloakService,\r\n\t\t{\r\n\t\t\tprovide: HTTP_INTERCEPTORS,\r\n\t\t\tuseClass: KeycloakBearerInterceptor,\r\n\t\t\tdeps: [KeycloakService],\r\n\t\t\tmulti: true,\r\n\t\t},\r\n\t\tawait KEYCLOAK_INITIALIZER(),\r\n\t];\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UserAccessConfigService","i3.AuthService","i2.AuthService","i3.UserConfigurationService"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -122,10 +122,59 @@ declare enum PermissionStatus {
|
|
|
122
122
|
NO_SUBSCRIPTION = "NO_SUBSCRIPTION"
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
declare enum DefaultPermissions {
|
|
126
|
+
ALL = "ALL"
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
interface PermissionsConfig<Permission, UserConfiguration> {
|
|
130
|
+
/** Depends on where this is used (either for plans or roles), keys are object identification string names. */
|
|
131
|
+
keys: string[];
|
|
132
|
+
permissions: Permission[];
|
|
133
|
+
userConfiguration: UserConfiguration;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
interface DefaultSubscriptionConfig {
|
|
137
|
+
/**
|
|
138
|
+
* Plan name that is used if user is not authenticated or is authenticated but no default plan for that case is provided.
|
|
139
|
+
* If this is not defined - it searches for "unauthorized".
|
|
140
|
+
*/
|
|
141
|
+
unauthorizedDefaultPermissionPlan?: string;
|
|
142
|
+
/**
|
|
143
|
+
* Plan name that is used only if user is authenticated. It is used when no active subscriptions are found or if "ignoreSubscriptions" is set to true.
|
|
144
|
+
* */
|
|
145
|
+
defaultPlanName?: string;
|
|
146
|
+
/**
|
|
147
|
+
* Even if user is authenticated, when this is set to true, all subscriptions are ignored and default plans are used.
|
|
148
|
+
*/
|
|
149
|
+
ignoreSubscriptions?: boolean;
|
|
150
|
+
/**
|
|
151
|
+
* If any subscriptions are expired, use speicific plan.
|
|
152
|
+
*/
|
|
153
|
+
expiredPermissionsPlanName?: string;
|
|
154
|
+
/**
|
|
155
|
+
* If user has no subscriptions but has MT roles.
|
|
156
|
+
*/
|
|
157
|
+
supportedRolesPermissionPlanName?: string;
|
|
158
|
+
/**
|
|
159
|
+
* Permission configs for subscription plans.
|
|
160
|
+
*/
|
|
161
|
+
plans: PermissionsConfig<unknown, unknown>[];
|
|
162
|
+
/**
|
|
163
|
+
* Permission configs for roles.
|
|
164
|
+
*/
|
|
165
|
+
roles?: PermissionsConfig<unknown, unknown>[];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
interface UserCustomConfiguration<T> {
|
|
126
169
|
updateUserConfiguration: (currentConfiguration: T, newConfiguration: T) => T;
|
|
127
170
|
}
|
|
128
171
|
|
|
172
|
+
declare class UserConfigurationService<T> implements UserCustomConfiguration<T> {
|
|
173
|
+
updateUserConfiguration(_currentConfiguration: T, _newConfiguration: T): T;
|
|
174
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<UserConfigurationService<any>, never>;
|
|
175
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<UserConfigurationService<any>>;
|
|
176
|
+
}
|
|
177
|
+
|
|
129
178
|
declare class PermissionsService<Permission, UserConfiguration> {
|
|
130
179
|
private readonly config;
|
|
131
180
|
private readonly auth;
|
|
@@ -149,7 +198,7 @@ declare class PermissionsService<Permission, UserConfiguration> {
|
|
|
149
198
|
get hasOnlyUnauthorizedPermissions(): boolean;
|
|
150
199
|
get onPermissionRefresh(): Observable<Permission[]>;
|
|
151
200
|
private readonly SUPPORT_ROLE_KEY;
|
|
152
|
-
constructor(config: UserAccessConfigService, auth: AuthService, userConfigurationService:
|
|
201
|
+
constructor(config: UserAccessConfigService, auth: AuthService, userConfigurationService: UserConfigurationService<UserConfiguration>);
|
|
153
202
|
/**
|
|
154
203
|
* Checks wether user has necessary permission/permissions. By default, if user has at least one of given permissions, method returns true. To check all permissions, set needsAll to true.
|
|
155
204
|
* @param permissions Permissions to be checked.
|
|
@@ -186,50 +235,5 @@ declare class PermissionsService<Permission, UserConfiguration> {
|
|
|
186
235
|
static ɵprov: i0.ɵɵInjectableDeclaration<PermissionsService<any, any>>;
|
|
187
236
|
}
|
|
188
237
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
interface PermissionsConfig<Permission, UserConfiguration> {
|
|
194
|
-
/** Depends on where this is used (either for plans or roles), keys are object identification string names. */
|
|
195
|
-
keys: string[];
|
|
196
|
-
permissions: Permission[];
|
|
197
|
-
userConfiguration: UserConfiguration;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
interface DefaultSubscriptionConfig {
|
|
201
|
-
/**
|
|
202
|
-
* Plan name that is used if user is not authenticated or is authenticated but no default plan for that case is provided.
|
|
203
|
-
* If this is not defined - it searches for "unauthorized".
|
|
204
|
-
*/
|
|
205
|
-
unauthorizedDefaultPermissionPlan?: string;
|
|
206
|
-
/**
|
|
207
|
-
* Plan name that is used only if user is authenticated. It is used when no active subscriptions are found or if "ignoreSubscriptions" is set to true.
|
|
208
|
-
* */
|
|
209
|
-
defaultPlanName?: string;
|
|
210
|
-
/**
|
|
211
|
-
* Even if user is authenticated, when this is set to true, all subscriptions are ignored and default plans are used.
|
|
212
|
-
*/
|
|
213
|
-
ignoreSubscriptions?: boolean;
|
|
214
|
-
/**
|
|
215
|
-
* If any subscriptions are expired, use speicific plan.
|
|
216
|
-
*/
|
|
217
|
-
expiredPermissionsPlanName?: string;
|
|
218
|
-
/**
|
|
219
|
-
* If user has no subscriptions but has MT roles.
|
|
220
|
-
*/
|
|
221
|
-
supportedRolesPermissionPlanName?: string;
|
|
222
|
-
/**
|
|
223
|
-
* Permission configs for subscription plans.
|
|
224
|
-
*/
|
|
225
|
-
plans: PermissionsConfig<unknown, unknown>[];
|
|
226
|
-
/**
|
|
227
|
-
* Permission configs for roles.
|
|
228
|
-
*/
|
|
229
|
-
roles?: PermissionsConfig<unknown, unknown>[];
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
declare const USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN: InjectionToken<unknown>;
|
|
233
|
-
|
|
234
|
-
export { AuthGuard, AuthGuardParamKeys, AuthService, DefaultPermissions, KEYCLOAK_PROVIDER, PermissionStatus, PermissionsService, USER_ACCESS_CONFIG_TOKEN, USER_CUSTOM_CONFIGURATION_SERVICE_TOKEN, UserAccessConfigService };
|
|
235
|
-
export type { AuthTokenParsed, DefaultSubscriptionConfig, PermissionsConfig, UserAccessConfig, UserCustomConfigurationService };
|
|
238
|
+
export { AuthGuard, AuthGuardParamKeys, AuthService, DefaultPermissions, KEYCLOAK_PROVIDER, PermissionStatus, PermissionsService, USER_ACCESS_CONFIG_TOKEN, UserAccessConfigService, UserConfigurationService };
|
|
239
|
+
export type { AuthTokenParsed, DefaultSubscriptionConfig, PermissionsConfig, UserAccessConfig, UserCustomConfiguration };
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tilde-nlp/ngx-user-access",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.4",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/common": "^20.
|
|
6
|
-
"@angular/core": "^20.
|
|
5
|
+
"@angular/common": "^20.0.0",
|
|
6
|
+
"@angular/core": "^20.0.0",
|
|
7
7
|
"@tilde-nlp/ngx-common": "^8.0.0",
|
|
8
8
|
"keycloak-angular": "^20.0.0",
|
|
9
9
|
"keycloak-js": "^26.2.0"
|