@verisoft/security-core 18.7.0 → 18.8.0

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.
Files changed (85) hide show
  1. package/README.md +7 -56
  2. package/esm2022/index.mjs +2 -0
  3. package/esm2022/lib/directives/has-permission.directive.mjs +55 -0
  4. package/esm2022/lib/directives/has-role.directive.mjs +55 -0
  5. package/esm2022/lib/directives/index.mjs +3 -0
  6. package/esm2022/lib/guards/auth.guard.mjs +40 -0
  7. package/esm2022/lib/guards/index.mjs +2 -0
  8. package/esm2022/lib/index.mjs +7 -0
  9. package/esm2022/lib/models/authenticated-user.model.mjs +2 -0
  10. package/esm2022/lib/models/config.model.mjs +2 -0
  11. package/esm2022/lib/models/functions.mjs +70 -0
  12. package/esm2022/lib/models/index.mjs +4 -0
  13. package/esm2022/lib/provider.mjs +47 -0
  14. package/esm2022/lib/services/auth-context.service.mjs +36 -0
  15. package/esm2022/lib/services/index.mjs +8 -0
  16. package/esm2022/lib/services/local-storage-token-provider.mjs +23 -0
  17. package/esm2022/lib/services/login.service.mjs +27 -0
  18. package/esm2022/lib/services/logout.service.mjs +18 -0
  19. package/esm2022/lib/services/security-initializer.mjs +14 -0
  20. package/esm2022/lib/services/session-token-provider.mjs +17 -0
  21. package/esm2022/lib/services/token-provider.mjs +2 -0
  22. package/esm2022/lib/state/actions.mjs +3 -0
  23. package/esm2022/lib/state/feature.mjs +8 -0
  24. package/esm2022/lib/state/index.mjs +5 -0
  25. package/esm2022/lib/state/reducers.mjs +8 -0
  26. package/esm2022/lib/state/selectors.mjs +5 -0
  27. package/esm2022/lib/state/state.mjs +4 -0
  28. package/esm2022/verisoft-security-core.mjs +5 -0
  29. package/fesm2022/verisoft-security-core.mjs +382 -0
  30. package/fesm2022/verisoft-security-core.mjs.map +1 -0
  31. package/index.d.ts +1 -0
  32. package/lib/directives/has-permission.directive.d.ts +17 -0
  33. package/lib/directives/has-role.directive.d.ts +17 -0
  34. package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +2 -2
  35. package/lib/guards/auth.guard.d.ts +13 -0
  36. package/{src/lib/guards/index.ts → lib/guards/index.d.ts} +1 -1
  37. package/{src/lib/index.ts → lib/index.d.ts} +6 -6
  38. package/{src/lib/models/authenticated-user.model.ts → lib/models/authenticated-user.model.d.ts} +8 -8
  39. package/{src/lib/models/config.model.ts → lib/models/config.model.d.ts} +8 -9
  40. package/lib/models/functions.d.ts +5 -0
  41. package/{src/lib/models/index.ts → lib/models/index.d.ts} +3 -3
  42. package/lib/provider.d.ts +14 -0
  43. package/lib/services/auth-context.service.d.ts +15 -0
  44. package/{src/lib/services/index.ts → lib/services/index.d.ts} +7 -7
  45. package/lib/services/local-storage-token-provider.d.ts +11 -0
  46. package/lib/services/login.service.d.ts +10 -0
  47. package/lib/services/logout.service.d.ts +8 -0
  48. package/lib/services/security-initializer.d.ts +5 -0
  49. package/lib/services/session-token-provider.d.ts +9 -0
  50. package/{src/lib/services/token-provider.ts → lib/services/token-provider.d.ts} +4 -5
  51. package/lib/state/actions.d.ts +6 -0
  52. package/lib/state/feature.d.ts +7 -0
  53. package/{src/lib/state/index.ts → lib/state/index.d.ts} +4 -4
  54. package/lib/state/reducers.d.ts +1 -0
  55. package/lib/state/selectors.d.ts +2 -0
  56. package/lib/state/state.d.ts +5 -0
  57. package/package.json +27 -11
  58. package/.eslintrc.json +0 -48
  59. package/jest.config.ts +0 -21
  60. package/ng-package.json +0 -7
  61. package/project.json +0 -36
  62. package/src/index.ts +0 -1
  63. package/src/lib/directives/has-permission.directive.ts +0 -54
  64. package/src/lib/directives/has-role.directive.ts +0 -54
  65. package/src/lib/guards/auth.guard.ts +0 -55
  66. package/src/lib/models/functions.spec.ts +0 -159
  67. package/src/lib/models/functions.ts +0 -103
  68. package/src/lib/provider.ts +0 -58
  69. package/src/lib/services/auth-context.service.ts +0 -38
  70. package/src/lib/services/local-storage-token-provider.ts +0 -23
  71. package/src/lib/services/local-token-provider.ts +0 -15
  72. package/src/lib/services/login.service.ts +0 -23
  73. package/src/lib/services/logout.service.ts +0 -15
  74. package/src/lib/services/security-initializer.ts +0 -26
  75. package/src/lib/services/session-token-provider.ts +0 -15
  76. package/src/lib/state/actions.ts +0 -7
  77. package/src/lib/state/feature.ts +0 -10
  78. package/src/lib/state/reducers.ts +0 -11
  79. package/src/lib/state/selectors.ts +0 -9
  80. package/src/lib/state/state.ts +0 -9
  81. package/src/test-setup.ts +0 -8
  82. package/tsconfig.json +0 -28
  83. package/tsconfig.lib.json +0 -17
  84. package/tsconfig.lib.prod.json +0 -9
  85. package/tsconfig.spec.json +0 -16
@@ -0,0 +1,5 @@
1
+ export * from './actions';
2
+ export * from './state';
3
+ export * from './reducers';
4
+ export * from './selectors';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc3RhdGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FjdGlvbnMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3N0YXRlJztcclxuZXhwb3J0ICogZnJvbSAnLi9yZWR1Y2Vycyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vc2VsZWN0b3JzJztcclxuIl19
@@ -0,0 +1,8 @@
1
+ import { createReducer, on } from '@ngrx/store';
2
+ import { setUser } from './actions';
3
+ import { initialState } from './state';
4
+ export const authReducer = createReducer(initialState, on(setUser, (state, action) => ({
5
+ ...state,
6
+ user: action.user
7
+ })));
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc3RhdGUvcmVkdWNlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQ3RDLFlBQVksRUFDWixFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5QixHQUFHLEtBQUs7SUFDUixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Q0FDbEIsQ0FBQyxDQUFDLENBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlZHVjZXIsIG9uIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBzZXRVc2VyIH0gZnJvbSAnLi9hY3Rpb25zJztcclxuaW1wb3J0IHsgaW5pdGlhbFN0YXRlIH0gZnJvbSAnLi9zdGF0ZSc7XHJcblxyXG5leHBvcnQgY29uc3QgYXV0aFJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKFxyXG4gIGluaXRpYWxTdGF0ZSxcclxuICBvbihzZXRVc2VyLCAoc3RhdGUsIGFjdGlvbikgPT4gKHtcclxuICAgIC4uLnN0YXRlLFxyXG4gICAgdXNlcjogYWN0aW9uLnVzZXJcclxuICB9KSlcclxuKTsiXX0=
@@ -0,0 +1,5 @@
1
+ import { createSelector } from '@ngrx/store';
2
+ import { SecurityFeature } from './feature';
3
+ export const selectIsAuthenticated = createSelector(SecurityFeature.selectUser, (user) => !!user);
4
+ export const selectUser = SecurityFeature.selectUser;
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYnMvc2VjdXJpdHkvY29yZS9zcmMvbGliL3N0YXRlL3NlbGVjdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUNqRCxlQUFlLENBQUMsVUFBVSxFQUMxQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3IgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IFNlY3VyaXR5RmVhdHVyZSB9IGZyb20gJy4vZmVhdHVyZSc7XHJcblxyXG5leHBvcnQgY29uc3Qgc2VsZWN0SXNBdXRoZW50aWNhdGVkID0gY3JlYXRlU2VsZWN0b3IoXHJcbiAgU2VjdXJpdHlGZWF0dXJlLnNlbGVjdFVzZXIsXHJcbiAgKHVzZXIpID0+ICEhdXNlclxyXG4pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNlbGVjdFVzZXIgPSBTZWN1cml0eUZlYXR1cmUuc2VsZWN0VXNlcjsiXX0=
@@ -0,0 +1,4 @@
1
+ export const initialState = {
2
+ user: undefined,
3
+ };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc3RhdGUvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFjO0lBQ3JDLElBQUksRUFBRSxTQUFTO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGVkVXNlciB9IGZyb20gJy4uL21vZGVscyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdGF0ZSB7XHJcbiAgdXNlcjogQXV0aGVudGljYXRlZFVzZXIgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpbml0aWFsU3RhdGU6IEF1dGhTdGF0ZSA9IHtcclxuICB1c2VyOiB1bmRlZmluZWQsXHJcbn07XHJcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaXNvZnQtc2VjdXJpdHktY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL3Zlcmlzb2Z0LXNlY3VyaXR5LWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,382 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, inject, NgModule, InjectionToken, APP_INITIALIZER, Directive, Input } from '@angular/core';
3
+ import { map, switchMap, of, from, firstValueFrom, distinctUntilChanged } from 'rxjs';
4
+ import * as i1 from '@ngrx/store';
5
+ import { createAction, props, createReducer, on, createFeature, createSelector, StoreModule } from '@ngrx/store';
6
+ import { Router } from '@angular/router';
7
+
8
+ function hasRequiredPermission(user, permission) {
9
+ return hasItems(user?.permissions, permission);
10
+ }
11
+ function hasRequiredRole(user, role) {
12
+ return hasItems(user?.roles, role);
13
+ }
14
+ function hasItems(userItems, neededItems) {
15
+ if (!neededItems || !neededItems.length) {
16
+ return true;
17
+ }
18
+ if (!userItems || !userItems.length) {
19
+ return false;
20
+ }
21
+ const userItemsSet = new Set(userItems);
22
+ if (Array.isArray(neededItems)) {
23
+ return neededItems.some((item) => hasItems(userItems, item));
24
+ }
25
+ if (neededItems.includes(',')) {
26
+ const splitItems = neededItems.split(',').map((i) => i.trim());
27
+ return splitItems.every((i) => userItemsSet.has(i));
28
+ }
29
+ return userItemsSet.has(neededItems);
30
+ }
31
+ function convertJWTToUser(base64Token) {
32
+ if (!base64Token) {
33
+ return undefined;
34
+ }
35
+ try {
36
+ const parts = base64Token.split('.');
37
+ if (parts.length < 2) {
38
+ return undefined;
39
+ }
40
+ const payload = decodeJwtPayload(parts[1]);
41
+ const userName = payload['unique_name'] ?? payload['nameid'];
42
+ if (!userName) {
43
+ return undefined;
44
+ }
45
+ const user = {
46
+ userName,
47
+ userId: payload['nameid'],
48
+ email: payload['email'],
49
+ displayName: payload['name'],
50
+ roles: convertToArray(payload, 'role'),
51
+ permissions: convertToArray(payload, 'permission'),
52
+ };
53
+ return user;
54
+ }
55
+ catch (error) {
56
+ return undefined;
57
+ }
58
+ }
59
+ function decodeJwtPayload(jwt) {
60
+ const base64 = jwt.replace(/-/g, '+').replace(/_/g, '/');
61
+ const jsonPayload = decodeURIComponent(atob(base64)
62
+ .split('')
63
+ .map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0'))
64
+ .join(''));
65
+ return JSON.parse(jsonPayload);
66
+ }
67
+ function convertToArray(item, propertyName) {
68
+ const rawValue = item[propertyName];
69
+ if (!rawValue) {
70
+ return undefined;
71
+ }
72
+ if (Array.isArray(rawValue)) {
73
+ return rawValue;
74
+ }
75
+ return [rawValue];
76
+ }
77
+
78
+ const setUser = createAction('[Auth] Set User', props());
79
+
80
+ const initialState = {
81
+ user: undefined,
82
+ };
83
+
84
+ const authReducer = createReducer(initialState, on(setUser, (state, action) => ({
85
+ ...state,
86
+ user: action.user
87
+ })));
88
+
89
+ const SECURITY_FEATURE_NAME = 'SECURITY';
90
+ const SecurityFeature = createFeature({
91
+ name: SECURITY_FEATURE_NAME,
92
+ reducer: authReducer
93
+ });
94
+
95
+ const selectIsAuthenticated = createSelector(SecurityFeature.selectUser, (user) => !!user);
96
+ const selectUser = SecurityFeature.selectUser;
97
+
98
+ class AuthContextService {
99
+ store;
100
+ user$;
101
+ isAuthenticated$;
102
+ constructor(store) {
103
+ this.store = store;
104
+ this.user$ = this.store.select(selectUser);
105
+ this.isAuthenticated$ = this.store.select(selectIsAuthenticated);
106
+ }
107
+ setUser(user) {
108
+ this.store.dispatch(setUser({ user }));
109
+ }
110
+ hasRequiredPermission(requiredPermissions) {
111
+ return this.user$.pipe(map((user) => hasRequiredPermission(user, requiredPermissions)));
112
+ }
113
+ hasRequiredRole(requiredPermissions) {
114
+ return this.user$.pipe(map((user) => hasRequiredRole(user, requiredPermissions)));
115
+ }
116
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AuthContextService, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Injectable });
117
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AuthContextService, providedIn: 'root' });
118
+ }
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AuthContextService, decorators: [{
120
+ type: Injectable,
121
+ args: [{
122
+ providedIn: 'root',
123
+ }]
124
+ }], ctorParameters: () => [{ type: i1.Store }] });
125
+
126
+ class AuthGuard {
127
+ config = inject(SECURITY_CONFIG);
128
+ router = inject(Router);
129
+ authContext = inject(AuthContextService);
130
+ canActivate(route) {
131
+ return this.checkPermissionsAndRolesAndNavigate(route, this.config.notAuthorizedPage);
132
+ }
133
+ canActivateChild(childRoute) {
134
+ return this.checkPermissionsAndRolesAndNavigate(childRoute, this.config.notAuthorizedPage);
135
+ }
136
+ checkPermissionsAndRolesAndNavigate(route, notAuthorizedUrl) {
137
+ const requiredPermissions = route.data['permissions'];
138
+ const requiredRoles = route.data['roles'];
139
+ return this.authContext.user$.pipe(map((user) => user &&
140
+ (!requiredPermissions ||
141
+ hasRequiredPermission(user, requiredPermissions)) &&
142
+ (!requiredRoles || hasRequiredPermission(user, requiredRoles))), switchMap((hasPermission) => {
143
+ if (!hasPermission && notAuthorizedUrl) {
144
+ return of(this.router.parseUrl(notAuthorizedUrl));
145
+ }
146
+ return of(!!hasPermission);
147
+ }));
148
+ }
149
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AuthGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
150
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AuthGuard, providedIn: 'root' });
151
+ }
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AuthGuard, decorators: [{
153
+ type: Injectable,
154
+ args: [{
155
+ providedIn: 'root',
156
+ }]
157
+ }] });
158
+
159
+ function provideSecurity(config = undefined) {
160
+ const securityConfig = {
161
+ tokenStorageKey: 'APP_TOKEN',
162
+ notAuthorizedPage: '/not-authorized',
163
+ ...(config ?? {}),
164
+ };
165
+ return [
166
+ AuthGuard,
167
+ SECURITY_INITIALIZER_PROVIDER,
168
+ { provide: SECURITY_CONTEXT_TOKEN_PROVIDER, useClass: LocalStorageTokenProvider },
169
+ { provide: SECURITY_CONFIG, useValue: securityConfig },
170
+ ];
171
+ }
172
+ class SecurityModule {
173
+ static forRoot(config) {
174
+ return {
175
+ ngModule: SecurityModule,
176
+ providers: [...provideSecurity(config)],
177
+ };
178
+ }
179
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SecurityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
180
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.8", ngImport: i0, type: SecurityModule, imports: [i1.StoreFeatureModule] });
181
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SecurityModule, imports: [StoreModule.forFeature(SecurityFeature)] });
182
+ }
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SecurityModule, decorators: [{
184
+ type: NgModule,
185
+ args: [{
186
+ imports: [StoreModule.forFeature(SecurityFeature)],
187
+ }]
188
+ }] });
189
+ const SECURITY_CONTEXT_TOKEN_PROVIDER = new InjectionToken('SECURITY_CONTEXT_TOKEN_PROVIDER');
190
+ const SECURITY_CONFIG = new InjectionToken('SECURITY_CONFIG');
191
+ const SECURITY_INITIALIZER_PROVIDER = {
192
+ provide: APP_INITIALIZER,
193
+ useFactory: securityInitializerFactory,
194
+ deps: [SECURITY_CONTEXT_TOKEN_PROVIDER, AuthContextService, SECURITY_CONFIG, Router],
195
+ multi: true,
196
+ };
197
+
198
+ class LocalStorageTokenProvider {
199
+ config = inject(SECURITY_CONFIG);
200
+ getToken() {
201
+ const token = localStorage.getItem(this.config.tokenStorageKey);
202
+ return of(token ?? undefined);
203
+ }
204
+ setToken(token) {
205
+ localStorage.setItem(this.config.tokenStorageKey, token);
206
+ }
207
+ removeToken() {
208
+ localStorage.clear();
209
+ }
210
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LocalStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
211
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LocalStorageTokenProvider });
212
+ }
213
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LocalStorageTokenProvider, decorators: [{
214
+ type: Injectable
215
+ }] });
216
+
217
+ function securityInitializerFactory(tokenProvider, authService, config, router) {
218
+ const initializationFn = tokenProvider.getToken().pipe(switchMap((token) => {
219
+ const user = convertJWTToUser(token);
220
+ if (config.loginPage && !user) {
221
+ return from(router.navigate([config.loginPage]));
222
+ }
223
+ authService.setUser(user);
224
+ return of({});
225
+ }));
226
+ return () => firstValueFrom(initializationFn);
227
+ }
228
+
229
+ class SessionStorageTokenProvider {
230
+ config = inject(SECURITY_CONFIG);
231
+ getToken() {
232
+ const token = sessionStorage.getItem(this.config.tokenStorageKey);
233
+ return of(token ?? undefined);
234
+ }
235
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SessionStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
236
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SessionStorageTokenProvider });
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SessionStorageTokenProvider, decorators: [{
239
+ type: Injectable
240
+ }] });
241
+
242
+ class LoginService {
243
+ config = inject(SECURITY_CONFIG);
244
+ tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);
245
+ authService = inject(AuthContextService);
246
+ router = inject(Router);
247
+ login(token) {
248
+ if (token) {
249
+ this.tokenProvider.setToken(token);
250
+ this.authService.setUser(convertJWTToUser(token));
251
+ }
252
+ else {
253
+ this.router.navigate([this.config.loginPage]);
254
+ }
255
+ }
256
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
257
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginService });
258
+ }
259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginService, decorators: [{
260
+ type: Injectable
261
+ }] });
262
+
263
+ class LogoutService {
264
+ tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);
265
+ authService = inject(AuthContextService);
266
+ logout() {
267
+ this.tokenProvider.removeToken();
268
+ this.authService.setUser(undefined);
269
+ }
270
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LogoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
271
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LogoutService });
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LogoutService, decorators: [{
274
+ type: Injectable
275
+ }] });
276
+
277
+ class HasPermissionDirective {
278
+ templateRef;
279
+ viewContainer;
280
+ authContext;
281
+ requiredPermissions = '';
282
+ sub;
283
+ constructor(templateRef, viewContainer, authContext) {
284
+ this.templateRef = templateRef;
285
+ this.viewContainer = viewContainer;
286
+ this.authContext = authContext;
287
+ }
288
+ set hasPermission(value) {
289
+ this.requiredPermissions = value;
290
+ this.updateView();
291
+ }
292
+ ngOnDestroy() {
293
+ this.unregister();
294
+ }
295
+ unregister() {
296
+ this.sub?.unsubscribe();
297
+ }
298
+ updateView() {
299
+ this.unregister();
300
+ if (this.requiredPermissions || this.requiredPermissions.length) {
301
+ this.sub = this.authContext
302
+ .hasRequiredPermission(this.requiredPermissions)
303
+ .pipe(distinctUntilChanged())
304
+ .subscribe((hasPerm) => {
305
+ if (hasPerm) {
306
+ this.viewContainer.createEmbeddedView(this.templateRef);
307
+ }
308
+ else {
309
+ this.viewContainer.clear();
310
+ }
311
+ });
312
+ }
313
+ }
314
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: HasPermissionDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });
315
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: HasPermissionDirective, isStandalone: true, selector: "[hasPermission]", inputs: { hasPermission: "hasPermission" }, ngImport: i0 });
316
+ }
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: HasPermissionDirective, decorators: [{
318
+ type: Directive,
319
+ args: [{
320
+ standalone: true,
321
+ selector: '[hasPermission]',
322
+ }]
323
+ }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AuthContextService }], propDecorators: { hasPermission: [{
324
+ type: Input
325
+ }] } });
326
+
327
+ class HasRoleDirective {
328
+ templateRef;
329
+ viewContainer;
330
+ authContext;
331
+ requiredRoles;
332
+ sub;
333
+ constructor(templateRef, viewContainer, authContext) {
334
+ this.templateRef = templateRef;
335
+ this.viewContainer = viewContainer;
336
+ this.authContext = authContext;
337
+ }
338
+ set hasRole(value) {
339
+ this.requiredRoles = value;
340
+ this.updateView();
341
+ }
342
+ ngOnDestroy() {
343
+ this.unregister();
344
+ }
345
+ unregister() {
346
+ this.sub?.unsubscribe();
347
+ }
348
+ updateView() {
349
+ this.unregister();
350
+ if (this.requiredRoles || this.requiredRoles?.length) {
351
+ this.sub = this.authContext
352
+ .hasRequiredRole(this.requiredRoles)
353
+ .pipe(distinctUntilChanged())
354
+ .subscribe((hasRole) => {
355
+ if (hasRole) {
356
+ this.viewContainer.createEmbeddedView(this.templateRef);
357
+ }
358
+ else {
359
+ this.viewContainer.clear();
360
+ }
361
+ });
362
+ }
363
+ }
364
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: HasRoleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });
365
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: HasRoleDirective, isStandalone: true, selector: "[hasRole]", inputs: { hasRole: "hasRole" }, ngImport: i0 });
366
+ }
367
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: HasRoleDirective, decorators: [{
368
+ type: Directive,
369
+ args: [{
370
+ standalone: true,
371
+ selector: '[hasRole]',
372
+ }]
373
+ }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AuthContextService }], propDecorators: { hasRole: [{
374
+ type: Input
375
+ }] } });
376
+
377
+ /**
378
+ * Generated bundle index. Do not edit.
379
+ */
380
+
381
+ export { AuthContextService, AuthGuard, HasPermissionDirective, HasRoleDirective, LocalStorageTokenProvider, LoginService, LogoutService, SECURITY_CONFIG, SECURITY_CONTEXT_TOKEN_PROVIDER, SECURITY_INITIALIZER_PROVIDER, SecurityModule, SessionStorageTokenProvider, authReducer, convertJWTToUser, decodeJwtPayload, hasRequiredPermission, hasRequiredRole, initialState, provideSecurity, securityInitializerFactory, selectIsAuthenticated, selectUser, setUser };
382
+ //# sourceMappingURL=verisoft-security-core.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verisoft-security-core.mjs","sources":["../../../../../src/libs/security/core/src/lib/models/functions.ts","../../../../../src/libs/security/core/src/lib/state/actions.ts","../../../../../src/libs/security/core/src/lib/state/state.ts","../../../../../src/libs/security/core/src/lib/state/reducers.ts","../../../../../src/libs/security/core/src/lib/state/feature.ts","../../../../../src/libs/security/core/src/lib/state/selectors.ts","../../../../../src/libs/security/core/src/lib/services/auth-context.service.ts","../../../../../src/libs/security/core/src/lib/guards/auth.guard.ts","../../../../../src/libs/security/core/src/lib/provider.ts","../../../../../src/libs/security/core/src/lib/services/local-storage-token-provider.ts","../../../../../src/libs/security/core/src/lib/services/security-initializer.ts","../../../../../src/libs/security/core/src/lib/services/session-token-provider.ts","../../../../../src/libs/security/core/src/lib/services/login.service.ts","../../../../../src/libs/security/core/src/lib/services/logout.service.ts","../../../../../src/libs/security/core/src/lib/directives/has-permission.directive.ts","../../../../../src/libs/security/core/src/lib/directives/has-role.directive.ts","../../../../../src/libs/security/core/src/verisoft-security-core.ts"],"sourcesContent":["import { AuthenticatedUser } from './authenticated-user.model';\r\n\r\nexport function hasRequiredPermission(\r\n user: AuthenticatedUser | undefined,\r\n permission: string | string[]\r\n): boolean {\r\n return hasItems(user?.permissions, permission);\r\n}\r\n\r\nexport function hasRequiredRole(\r\n user: AuthenticatedUser | undefined,\r\n role: string | string[]\r\n): boolean {\r\n return hasItems(user?.roles, role);\r\n}\r\n\r\nfunction hasItems(\r\n userItems: string[] | undefined,\r\n neededItems: string | string[]\r\n): boolean {\r\n if (!neededItems || !neededItems.length) {\r\n return true;\r\n }\r\n\r\n if (!userItems || !userItems.length) {\r\n return false;\r\n }\r\n\r\n const userItemsSet = new Set(userItems);\r\n if (Array.isArray(neededItems)) {\r\n return neededItems.some((item) => hasItems(userItems, item));\r\n }\r\n\r\n if (neededItems.includes(',')) {\r\n const splitItems = neededItems.split(',').map((i) => i.trim());\r\n return splitItems.every((i) => userItemsSet.has(i));\r\n }\r\n\r\n return userItemsSet.has(neededItems);\r\n}\r\n\r\nexport function convertJWTToUser(\r\n base64Token?: string\r\n): AuthenticatedUser | undefined {\r\n if (!base64Token) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n const parts = base64Token.split('.');\r\n if (parts.length < 2) {\r\n return undefined;\r\n }\r\n const payload = decodeJwtPayload(parts[1]);\r\n\r\n const userName = payload['unique_name'] ?? payload['nameid'];\r\n if (!userName) {\r\n return undefined;\r\n }\r\n\r\n const user: AuthenticatedUser = {\r\n userName,\r\n userId: payload['nameid'],\r\n email: payload['email'],\r\n displayName: payload['name'],\r\n roles: convertToArray(payload, 'role'),\r\n permissions: convertToArray(payload, 'permission'),\r\n };\r\n\r\n return user;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport function decodeJwtPayload(jwt: string): any {\r\n const base64 = jwt.replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n const jsonPayload = decodeURIComponent(\r\n atob(base64)\r\n .split('')\r\n .map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0'))\r\n .join('')\r\n );\r\n\r\n return JSON.parse(jsonPayload);\r\n}\r\n\r\nfunction convertToArray(\r\n item: { [key: string]: string | string[] },\r\n propertyName: string\r\n): string[] | undefined {\r\n const rawValue = item[propertyName];\r\n if (!rawValue) {\r\n return undefined;\r\n }\r\n\r\n if (Array.isArray(rawValue)) {\r\n return rawValue;\r\n }\r\n\r\n return [rawValue];\r\n}\r\n","import { createAction, props } from '@ngrx/store';\r\nimport { AuthenticatedUser } from '../models';\r\n\r\nexport const setUser = createAction(\r\n '[Auth] Set User',\r\n props<{ user: AuthenticatedUser | undefined }>()\r\n);\r\n","import { AuthenticatedUser } from '../models';\r\n\r\nexport interface AuthState {\r\n user: AuthenticatedUser | undefined;\r\n}\r\n\r\nexport const initialState: AuthState = {\r\n user: undefined,\r\n};\r\n","import { createReducer, on } from '@ngrx/store';\r\nimport { setUser } from './actions';\r\nimport { initialState } from './state';\r\n\r\nexport const authReducer = createReducer(\r\n initialState,\r\n on(setUser, (state, action) => ({\r\n ...state,\r\n user: action.user\r\n }))\r\n);","import { createFeature } from \"@ngrx/store\"\r\nimport { authReducer } from \"./reducers\"\r\n\r\nexport const SECURITY_FEATURE_NAME = 'SECURITY';\r\n\r\nexport const SecurityFeature = createFeature({\r\n name: SECURITY_FEATURE_NAME,\r\n reducer: authReducer\r\n});\r\n\r\n","import { createSelector } from '@ngrx/store';\r\nimport { SecurityFeature } from './feature';\r\n\r\nexport const selectIsAuthenticated = createSelector(\r\n SecurityFeature.selectUser,\r\n (user) => !!user\r\n);\r\n\r\nexport const selectUser = SecurityFeature.selectUser;","import { Injectable } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\nimport { map, Observable } from 'rxjs';\r\nimport { AuthenticatedUser } from '../models';\r\nimport { hasRequiredPermission, hasRequiredRole } from '../models/functions';\r\nimport { setUser } from '../state/actions';\r\nimport { selectIsAuthenticated, selectUser } from '../state/selectors';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthContextService {\r\n user$: Observable<AuthenticatedUser | undefined>;\r\n isAuthenticated$: Observable<boolean>;\r\n\r\n constructor(private store: Store) {\r\n this.user$ = this.store.select(selectUser);\r\n this.isAuthenticated$ = this.store.select(selectIsAuthenticated);\r\n }\r\n\r\n setUser(user: AuthenticatedUser | undefined): void {\r\n this.store.dispatch(setUser({ user }));\r\n }\r\n\r\n hasRequiredPermission(\r\n requiredPermissions: string | string[]\r\n ): Observable<boolean> {\r\n return this.user$.pipe(\r\n map((user) => hasRequiredPermission(user, requiredPermissions))\r\n );\r\n }\r\n\r\n hasRequiredRole(requiredPermissions: string | string[]): Observable<boolean> {\r\n return this.user$.pipe(\r\n map((user) => hasRequiredRole(user, requiredPermissions))\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport {\r\n ActivatedRouteSnapshot,\r\n CanActivate,\r\n CanActivateChild,\r\n Router,\r\n UrlTree,\r\n} from '@angular/router';\r\nimport { map, Observable, of, switchMap } from 'rxjs';\r\nimport { SecurityConfig } from '../models';\r\nimport { hasRequiredPermission } from '../models/functions';\r\nimport { SECURITY_CONFIG } from '../provider';\r\nimport { AuthContextService } from '../services';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthGuard implements CanActivate, CanActivateChild {\r\n private config = inject<SecurityConfig>(SECURITY_CONFIG);\r\n private router = inject(Router);\r\n private authContext = inject(AuthContextService);\r\n\r\n canActivate(route: ActivatedRouteSnapshot): Observable<boolean | UrlTree> {\r\n return this.checkPermissionsAndRolesAndNavigate(route, this.config.notAuthorizedPage);\r\n }\r\n\r\n canActivateChild(\r\n childRoute: ActivatedRouteSnapshot\r\n ): Observable<boolean | UrlTree> {\r\n return this.checkPermissionsAndRolesAndNavigate(childRoute, this.config.notAuthorizedPage);\r\n }\r\n\r\n private checkPermissionsAndRolesAndNavigate(\r\n route: ActivatedRouteSnapshot,\r\n notAuthorizedUrl: string | undefined\r\n ): Observable<boolean | UrlTree> {\r\n const requiredPermissions = route.data['permissions'] as | string | string[] | undefined;\r\n const requiredRoles = route.data['roles'] as string | string[] | undefined;\r\n\r\n return this.authContext.user$.pipe(\r\n map(\r\n (user) => user &&\r\n (!requiredPermissions ||\r\n hasRequiredPermission(user, requiredPermissions)) &&\r\n (!requiredRoles || hasRequiredPermission(user, requiredRoles))\r\n ),\r\n switchMap((hasPermission) => {\r\n if (!hasPermission && notAuthorizedUrl) {\r\n return of(this.router.parseUrl(notAuthorizedUrl));\r\n }\r\n return of(!!hasPermission);\r\n })\r\n );\r\n }\r\n}\r\n","import {\r\n APP_INITIALIZER,\r\n InjectionToken,\r\n ModuleWithProviders,\r\n NgModule,\r\n Provider,\r\n} from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { StoreModule } from '@ngrx/store';\r\nimport { AuthGuard } from './guards';\r\nimport { SecurityConfig } from './models';\r\nimport {\r\n AuthContextService,\r\n LocalStorageTokenProvider,\r\n securityInitializerFactory,\r\n} from './services';\r\nimport { SecurityFeature } from './state/feature';\r\n\r\nexport function provideSecurity(\r\n config: Partial<SecurityConfig> | undefined = undefined\r\n): Provider[] {\r\n const securityConfig: SecurityConfig = {\r\n tokenStorageKey: 'APP_TOKEN',\r\n notAuthorizedPage: '/not-authorized',\r\n ...(config ?? {}),\r\n };\r\n return [\r\n AuthGuard,\r\n SECURITY_INITIALIZER_PROVIDER,\r\n { provide: SECURITY_CONTEXT_TOKEN_PROVIDER, useClass: LocalStorageTokenProvider },\r\n { provide: SECURITY_CONFIG, useValue: securityConfig },\r\n ];\r\n}\r\n\r\n@NgModule({\r\n imports: [StoreModule.forFeature(SecurityFeature)],\r\n})\r\nexport class SecurityModule {\r\n static forRoot(\r\n config?: Partial<SecurityConfig>\r\n ): ModuleWithProviders<SecurityModule> {\r\n return {\r\n ngModule: SecurityModule,\r\n providers: [...provideSecurity(config)],\r\n };\r\n }\r\n}\r\n\r\nexport const SECURITY_CONTEXT_TOKEN_PROVIDER = new InjectionToken('SECURITY_CONTEXT_TOKEN_PROVIDER');\r\n\r\nexport const SECURITY_CONFIG = new InjectionToken('SECURITY_CONFIG');\r\n\r\nexport const SECURITY_INITIALIZER_PROVIDER: Provider = {\r\n provide: APP_INITIALIZER,\r\n useFactory: securityInitializerFactory,\r\n deps: [SECURITY_CONTEXT_TOKEN_PROVIDER, AuthContextService, SECURITY_CONFIG, Router],\r\n multi: true,\r\n};\r\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { SecurityConfig } from '../models';\nimport { SECURITY_CONFIG } from '../provider';\nimport { TokenProvider } from './token-provider';\n\n@Injectable()\nexport class LocalStorageTokenProvider implements TokenProvider {\n private config = inject<SecurityConfig>(SECURITY_CONFIG);\n\n getToken(): Observable<string | undefined> {\n const token = localStorage.getItem(this.config.tokenStorageKey);\n return of(token ?? undefined);\n }\n\n setToken(token: string): void {\n localStorage.setItem(this.config.tokenStorageKey, token);\n }\n\n removeToken(): void {\n localStorage.clear();\n }\n}\n","import { Router } from '@angular/router';\r\nimport { firstValueFrom, from, of, switchMap } from 'rxjs';\r\nimport { convertJWTToUser, SecurityConfig } from '../models';\r\nimport { AuthContextService } from './auth-context.service';\r\nimport { TokenProvider } from './token-provider';\r\n\r\nexport function securityInitializerFactory(\r\n tokenProvider: TokenProvider,\r\n authService: AuthContextService,\r\n config: SecurityConfig,\r\n router: Router\r\n): () => Promise<unknown> {\r\n const initializationFn = tokenProvider.getToken().pipe(\r\n switchMap((token) => {\r\n const user = convertJWTToUser(token);\r\n if (config.loginPage && !user) {\r\n return from(router.navigate([config.loginPage]));\r\n }\r\n\r\n authService.setUser(user);\r\n return of({});\r\n })\r\n );\r\n\r\n return () => firstValueFrom(initializationFn)\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { SecurityConfig } from '../models';\r\nimport { SECURITY_CONFIG } from '../provider';\r\nimport { TokenProvider } from './token-provider';\r\n\r\n@Injectable()\r\nexport class SessionStorageTokenProvider implements TokenProvider {\r\n private config = inject<SecurityConfig>(SECURITY_CONFIG);\r\n\r\n getToken(): Observable<string | undefined> {\r\n const token = sessionStorage.getItem(this.config.tokenStorageKey);\r\n return of(token ?? undefined);\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { convertJWTToUser, SecurityConfig } from '../models';\nimport { SECURITY_CONFIG, SECURITY_CONTEXT_TOKEN_PROVIDER } from '../provider';\nimport { AuthContextService } from './auth-context.service';\nimport { LocalStorageTokenProvider } from './local-storage-token-provider';\n\n@Injectable()\nexport class LoginService {\n private config = inject<SecurityConfig>(SECURITY_CONFIG);\n private tokenProvider = inject<LocalStorageTokenProvider>(SECURITY_CONTEXT_TOKEN_PROVIDER);\n private authService = inject(AuthContextService);\n private router = inject(Router);\n\n login(token?: string): void {\n if (token) {\n this.tokenProvider.setToken(token);\n this.authService.setUser(convertJWTToUser(token));\n } else {\n this.router.navigate([this.config.loginPage]);\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { SECURITY_CONTEXT_TOKEN_PROVIDER } from '../provider';\nimport { AuthContextService } from './auth-context.service';\nimport { LocalStorageTokenProvider } from './local-storage-token-provider';\n\n@Injectable()\nexport class LogoutService {\n private readonly tokenProvider = inject<LocalStorageTokenProvider>(SECURITY_CONTEXT_TOKEN_PROVIDER);\n private readonly authService = inject(AuthContextService);\n\n logout(): void {\n this.tokenProvider.removeToken();\n this.authService.setUser(undefined);\n }\n}\n","import {\r\n Directive,\r\n Input,\r\n TemplateRef,\r\n ViewContainerRef,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { distinctUntilChanged, Subscription } from 'rxjs';\r\nimport { AuthContextService } from '../services';\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[hasPermission]',\r\n})\r\nexport class HasPermissionDirective<T> implements OnDestroy {\r\n private requiredPermissions: string | string[] = '';\r\n private sub?: Subscription;\r\n\r\n constructor(\r\n private templateRef: TemplateRef<T>,\r\n private viewContainer: ViewContainerRef,\r\n private authContext: AuthContextService\r\n ) {}\r\n\r\n @Input()\r\n set hasPermission(value: string | string[]) {\r\n this.requiredPermissions = value;\r\n this.updateView();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unregister();\r\n }\r\n\r\n private unregister() {\r\n this.sub?.unsubscribe();\r\n }\r\n\r\n private updateView(): void {\r\n this.unregister();\r\n if (this.requiredPermissions || this.requiredPermissions.length) {\r\n this.sub = this.authContext\r\n .hasRequiredPermission(this.requiredPermissions)\r\n .pipe(distinctUntilChanged())\r\n .subscribe((hasPerm) => {\r\n if (hasPerm) {\r\n this.viewContainer.createEmbeddedView(this.templateRef);\r\n } else {\r\n this.viewContainer.clear();\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import {\r\n Directive,\r\n Input,\r\n TemplateRef,\r\n ViewContainerRef,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { distinctUntilChanged, Subscription } from 'rxjs';\r\nimport { AuthContextService } from '../services';\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[hasRole]',\r\n})\r\nexport class HasRoleDirective<T> implements OnDestroy {\r\n private requiredRoles: string | string[] | undefined;\r\n private sub?: Subscription;\r\n\r\n constructor(\r\n private templateRef: TemplateRef<T>,\r\n private viewContainer: ViewContainerRef,\r\n private authContext: AuthContextService\r\n ) {}\r\n\r\n @Input()\r\n set hasRole(value: string | string[]) {\r\n this.requiredRoles = value;\r\n this.updateView();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unregister();\r\n }\r\n\r\n private unregister() {\r\n this.sub?.unsubscribe();\r\n }\r\n\r\n private updateView(): void {\r\n this.unregister();\r\n if (this.requiredRoles || this.requiredRoles?.length) {\r\n this.sub = this.authContext\r\n .hasRequiredRole(this.requiredRoles)\r\n .pipe(distinctUntilChanged())\r\n .subscribe((hasRole) => {\r\n if (hasRole) {\r\n this.viewContainer.createEmbeddedView(this.templateRef);\r\n } else {\r\n this.viewContainer.clear();\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AuthContextService"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib';
@@ -0,0 +1,17 @@
1
+ import { TemplateRef, ViewContainerRef, OnDestroy } from '@angular/core';
2
+ import { AuthContextService } from '../services';
3
+ import * as i0 from "@angular/core";
4
+ export declare class HasPermissionDirective<T> implements OnDestroy {
5
+ private templateRef;
6
+ private viewContainer;
7
+ private authContext;
8
+ private requiredPermissions;
9
+ private sub?;
10
+ constructor(templateRef: TemplateRef<T>, viewContainer: ViewContainerRef, authContext: AuthContextService);
11
+ set hasPermission(value: string | string[]);
12
+ ngOnDestroy(): void;
13
+ private unregister;
14
+ private updateView;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<HasPermissionDirective<any>, never>;
16
+ static ɵdir: i0.ɵɵDirectiveDeclaration<HasPermissionDirective<any>, "[hasPermission]", never, { "hasPermission": { "alias": "hasPermission"; "required": false; }; }, {}, never, never, true, never>;
17
+ }
@@ -0,0 +1,17 @@
1
+ import { TemplateRef, ViewContainerRef, OnDestroy } from '@angular/core';
2
+ import { AuthContextService } from '../services';
3
+ import * as i0 from "@angular/core";
4
+ export declare class HasRoleDirective<T> implements OnDestroy {
5
+ private templateRef;
6
+ private viewContainer;
7
+ private authContext;
8
+ private requiredRoles;
9
+ private sub?;
10
+ constructor(templateRef: TemplateRef<T>, viewContainer: ViewContainerRef, authContext: AuthContextService);
11
+ set hasRole(value: string | string[]);
12
+ ngOnDestroy(): void;
13
+ private unregister;
14
+ private updateView;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<HasRoleDirective<any>, never>;
16
+ static ɵdir: i0.ɵɵDirectiveDeclaration<HasRoleDirective<any>, "[hasRole]", never, { "hasRole": { "alias": "hasRole"; "required": false; }; }, {}, never, never, true, never>;
17
+ }
@@ -1,2 +1,2 @@
1
- export * from './has-permission.directive';
2
- export * from './has-role.directive';
1
+ export * from './has-permission.directive';
2
+ export * from './has-role.directive';
@@ -0,0 +1,13 @@
1
+ import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, UrlTree } from '@angular/router';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export declare class AuthGuard implements CanActivate, CanActivateChild {
5
+ private config;
6
+ private router;
7
+ private authContext;
8
+ canActivate(route: ActivatedRouteSnapshot): Observable<boolean | UrlTree>;
9
+ canActivateChild(childRoute: ActivatedRouteSnapshot): Observable<boolean | UrlTree>;
10
+ private checkPermissionsAndRolesAndNavigate;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<AuthGuard, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<AuthGuard>;
13
+ }
@@ -1 +1 @@
1
- export * from './auth.guard';
1
+ export * from './auth.guard';
@@ -1,6 +1,6 @@
1
- export * from './directives';
2
- export * from './guards';
3
- export * from './models';
4
- export * from './services';
5
- export * from './state';
6
- export * from './provider';
1
+ export * from './directives';
2
+ export * from './guards';
3
+ export * from './models';
4
+ export * from './services';
5
+ export * from './state';
6
+ export * from './provider';
@@ -1,8 +1,8 @@
1
- export interface AuthenticatedUser {
2
- userId?: string;
3
- userName: string;
4
- email: string;
5
- displayName?: string;
6
- roles: string[] | undefined;
7
- permissions: string[] | undefined;
8
- }
1
+ export interface AuthenticatedUser {
2
+ userId?: string;
3
+ userName: string;
4
+ email: string;
5
+ displayName?: string;
6
+ roles: string[] | undefined;
7
+ permissions: string[] | undefined;
8
+ }
@@ -1,9 +1,8 @@
1
-
2
- export interface SecurityConfig {
3
- tokenStorageKey: string;
4
- contextTokenStorageKey?: string;
5
- loginPage?: string;
6
- logoutPage?: string;
7
- notAuthorizedPage?: string;
8
- sendTokenHeader?: boolean;
9
- }
1
+ export interface SecurityConfig {
2
+ tokenStorageKey: string;
3
+ contextTokenStorageKey?: string;
4
+ loginPage?: string;
5
+ logoutPage?: string;
6
+ notAuthorizedPage?: string;
7
+ sendTokenHeader?: boolean;
8
+ }
@@ -0,0 +1,5 @@
1
+ import { AuthenticatedUser } from './authenticated-user.model';
2
+ export declare function hasRequiredPermission(user: AuthenticatedUser | undefined, permission: string | string[]): boolean;
3
+ export declare function hasRequiredRole(user: AuthenticatedUser | undefined, role: string | string[]): boolean;
4
+ export declare function convertJWTToUser(base64Token?: string): AuthenticatedUser | undefined;
5
+ export declare function decodeJwtPayload(jwt: string): any;
@@ -1,3 +1,3 @@
1
- export * from './authenticated-user.model';
2
- export * from './functions';
3
- export * from './config.model';
1
+ export * from './authenticated-user.model';
2
+ export * from './functions';
3
+ export * from './config.model';
@@ -0,0 +1,14 @@
1
+ import { InjectionToken, ModuleWithProviders, Provider } from '@angular/core';
2
+ import { SecurityConfig } from './models';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@ngrx/store";
5
+ export declare function provideSecurity(config?: Partial<SecurityConfig> | undefined): Provider[];
6
+ export declare class SecurityModule {
7
+ static forRoot(config?: Partial<SecurityConfig>): ModuleWithProviders<SecurityModule>;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<SecurityModule, never>;
9
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SecurityModule, never, [typeof i1.StoreFeatureModule], never>;
10
+ static ɵinj: i0.ɵɵInjectorDeclaration<SecurityModule>;
11
+ }
12
+ export declare const SECURITY_CONTEXT_TOKEN_PROVIDER: InjectionToken<unknown>;
13
+ export declare const SECURITY_CONFIG: InjectionToken<unknown>;
14
+ export declare const SECURITY_INITIALIZER_PROVIDER: Provider;