@verisoft/security-core 18.7.0 → 19.0.0-1
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 +7 -56
- package/fesm2022/verisoft-security-core.mjs +380 -0
- package/fesm2022/verisoft-security-core.mjs.map +1 -0
- package/index.d.ts +1 -0
- package/lib/directives/has-permission.directive.d.ts +17 -0
- package/lib/directives/has-role.directive.d.ts +17 -0
- package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +2 -2
- package/lib/guards/auth.guard.d.ts +13 -0
- package/{src/lib/guards/index.ts → lib/guards/index.d.ts} +1 -1
- package/{src/lib/index.ts → lib/index.d.ts} +6 -6
- package/{src/lib/models/authenticated-user.model.ts → lib/models/authenticated-user.model.d.ts} +8 -8
- package/{src/lib/models/config.model.ts → lib/models/config.model.d.ts} +8 -9
- package/lib/models/functions.d.ts +5 -0
- package/{src/lib/models/index.ts → lib/models/index.d.ts} +3 -3
- package/lib/provider.d.ts +14 -0
- package/lib/services/auth-context.service.d.ts +15 -0
- package/{src/lib/services/index.ts → lib/services/index.d.ts} +7 -7
- package/lib/services/local-storage-token-provider.d.ts +11 -0
- package/lib/services/login.service.d.ts +10 -0
- package/lib/services/logout.service.d.ts +8 -0
- package/lib/services/security-initializer.d.ts +5 -0
- package/lib/services/session-token-provider.d.ts +9 -0
- package/{src/lib/services/token-provider.ts → lib/services/token-provider.d.ts} +4 -5
- package/lib/state/actions.d.ts +6 -0
- package/lib/state/feature.d.ts +7 -0
- package/{src/lib/state/index.ts → lib/state/index.d.ts} +4 -4
- package/lib/state/reducers.d.ts +1 -0
- package/lib/state/selectors.d.ts +2 -0
- package/lib/state/state.d.ts +5 -0
- package/package.json +25 -11
- package/.eslintrc.json +0 -48
- package/jest.config.ts +0 -21
- package/ng-package.json +0 -7
- package/project.json +0 -36
- package/src/index.ts +0 -1
- package/src/lib/directives/has-permission.directive.ts +0 -54
- package/src/lib/directives/has-role.directive.ts +0 -54
- package/src/lib/guards/auth.guard.ts +0 -55
- package/src/lib/models/functions.spec.ts +0 -159
- package/src/lib/models/functions.ts +0 -103
- package/src/lib/provider.ts +0 -58
- package/src/lib/services/auth-context.service.ts +0 -38
- package/src/lib/services/local-storage-token-provider.ts +0 -23
- package/src/lib/services/local-token-provider.ts +0 -15
- package/src/lib/services/login.service.ts +0 -23
- package/src/lib/services/logout.service.ts +0 -15
- package/src/lib/services/security-initializer.ts +0 -26
- package/src/lib/services/session-token-provider.ts +0 -15
- package/src/lib/state/actions.ts +0 -7
- package/src/lib/state/feature.ts +0 -10
- package/src/lib/state/reducers.ts +0 -11
- package/src/lib/state/selectors.ts +0 -9
- package/src/lib/state/state.ts +0 -9
- package/src/test-setup.ts +0 -8
- package/tsconfig.json +0 -28
- package/tsconfig.lib.json +0 -17
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -16
package/README.md
CHANGED
|
@@ -1,56 +1,7 @@
|
|
|
1
|
-
# security-core
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
- Security-related Angular services and guards
|
|
9
|
-
- Shared security interfaces and types
|
|
10
|
-
|
|
11
|
-
## Installation
|
|
12
|
-
|
|
13
|
-
This package is intended for internal use within the monorepo. To use it in another library or app, add it as a dependency in your `project.json`:
|
|
14
|
-
|
|
15
|
-
```json
|
|
16
|
-
"dependencies": {
|
|
17
|
-
"security-core": "*"
|
|
18
|
-
}
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Usage
|
|
22
|
-
|
|
23
|
-
Import the required modules, services, or utilities from `security-core`:
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
import { AuthService } from '@verisoft/security-core';
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Development
|
|
30
|
-
|
|
31
|
-
### Building
|
|
32
|
-
|
|
33
|
-
Run the following command to build the library:
|
|
34
|
-
|
|
35
|
-
```sh
|
|
36
|
-
nx build security-core
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Running Unit Tests
|
|
40
|
-
|
|
41
|
-
To execute the unit tests for this library:
|
|
42
|
-
|
|
43
|
-
```sh
|
|
44
|
-
nx test security-core
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Contributing
|
|
48
|
-
|
|
49
|
-
1. Fork the repository and create your branch from `master`.
|
|
50
|
-
2. Make your changes and add tests if needed.
|
|
51
|
-
3. Run `nx test security-core` to ensure all tests pass.
|
|
52
|
-
4. Submit a pull request.
|
|
53
|
-
|
|
54
|
-
## License
|
|
55
|
-
|
|
56
|
-
This project is licensed under the MIT License.
|
|
1
|
+
# security-core
|
|
2
|
+
|
|
3
|
+
This library was generated with [Nx](https://nx.dev).
|
|
4
|
+
|
|
5
|
+
## Running unit tests
|
|
6
|
+
|
|
7
|
+
Run `nx test security-core` to execute the unit tests.
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, inject, InjectionToken, provideAppInitializer, NgModule, Input, Directive } 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: "19.2.9", ngImport: i0, type: AuthContextService, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
117
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: AuthContextService, providedIn: 'root' });
|
|
118
|
+
}
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", 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: "19.2.9", ngImport: i0, type: AuthGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
150
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: AuthGuard, providedIn: 'root' });
|
|
151
|
+
}
|
|
152
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", 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: "19.2.9", ngImport: i0, type: SecurityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
180
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.9", ngImport: i0, type: SecurityModule, imports: [i1.StoreFeatureModule] });
|
|
181
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: SecurityModule, imports: [StoreModule.forFeature(SecurityFeature)] });
|
|
182
|
+
}
|
|
183
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", 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 = provideAppInitializer(() => {
|
|
192
|
+
const initializerFn = (securityInitializerFactory)(inject(SECURITY_CONTEXT_TOKEN_PROVIDER), inject(AuthContextService), inject(SECURITY_CONFIG), inject(Router));
|
|
193
|
+
return initializerFn();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
class LocalStorageTokenProvider {
|
|
197
|
+
config = inject(SECURITY_CONFIG);
|
|
198
|
+
getToken() {
|
|
199
|
+
const token = localStorage.getItem(this.config.tokenStorageKey);
|
|
200
|
+
return of(token ?? undefined);
|
|
201
|
+
}
|
|
202
|
+
setToken(token) {
|
|
203
|
+
localStorage.setItem(this.config.tokenStorageKey, token);
|
|
204
|
+
}
|
|
205
|
+
removeToken() {
|
|
206
|
+
localStorage.clear();
|
|
207
|
+
}
|
|
208
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LocalStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
209
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LocalStorageTokenProvider });
|
|
210
|
+
}
|
|
211
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LocalStorageTokenProvider, decorators: [{
|
|
212
|
+
type: Injectable
|
|
213
|
+
}] });
|
|
214
|
+
|
|
215
|
+
function securityInitializerFactory(tokenProvider, authService, config, router) {
|
|
216
|
+
const initializationFn = tokenProvider.getToken().pipe(switchMap((token) => {
|
|
217
|
+
const user = convertJWTToUser(token);
|
|
218
|
+
if (config.loginPage && !user) {
|
|
219
|
+
return from(router.navigate([config.loginPage]));
|
|
220
|
+
}
|
|
221
|
+
authService.setUser(user);
|
|
222
|
+
return of({});
|
|
223
|
+
}));
|
|
224
|
+
return () => firstValueFrom(initializationFn);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
class SessionStorageTokenProvider {
|
|
228
|
+
config = inject(SECURITY_CONFIG);
|
|
229
|
+
getToken() {
|
|
230
|
+
const token = sessionStorage.getItem(this.config.tokenStorageKey);
|
|
231
|
+
return of(token ?? undefined);
|
|
232
|
+
}
|
|
233
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: SessionStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
234
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: SessionStorageTokenProvider });
|
|
235
|
+
}
|
|
236
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: SessionStorageTokenProvider, decorators: [{
|
|
237
|
+
type: Injectable
|
|
238
|
+
}] });
|
|
239
|
+
|
|
240
|
+
class LoginService {
|
|
241
|
+
config = inject(SECURITY_CONFIG);
|
|
242
|
+
tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);
|
|
243
|
+
authService = inject(AuthContextService);
|
|
244
|
+
router = inject(Router);
|
|
245
|
+
login(token) {
|
|
246
|
+
if (token) {
|
|
247
|
+
this.tokenProvider.setToken(token);
|
|
248
|
+
this.authService.setUser(convertJWTToUser(token));
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this.router.navigate([this.config.loginPage]);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
255
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LoginService });
|
|
256
|
+
}
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LoginService, decorators: [{
|
|
258
|
+
type: Injectable
|
|
259
|
+
}] });
|
|
260
|
+
|
|
261
|
+
class LogoutService {
|
|
262
|
+
tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);
|
|
263
|
+
authService = inject(AuthContextService);
|
|
264
|
+
logout() {
|
|
265
|
+
this.tokenProvider.removeToken();
|
|
266
|
+
this.authService.setUser(undefined);
|
|
267
|
+
}
|
|
268
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LogoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
269
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LogoutService });
|
|
270
|
+
}
|
|
271
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: LogoutService, decorators: [{
|
|
272
|
+
type: Injectable
|
|
273
|
+
}] });
|
|
274
|
+
|
|
275
|
+
class HasPermissionDirective {
|
|
276
|
+
templateRef;
|
|
277
|
+
viewContainer;
|
|
278
|
+
authContext;
|
|
279
|
+
requiredPermissions = '';
|
|
280
|
+
sub;
|
|
281
|
+
constructor(templateRef, viewContainer, authContext) {
|
|
282
|
+
this.templateRef = templateRef;
|
|
283
|
+
this.viewContainer = viewContainer;
|
|
284
|
+
this.authContext = authContext;
|
|
285
|
+
}
|
|
286
|
+
set hasPermission(value) {
|
|
287
|
+
this.requiredPermissions = value;
|
|
288
|
+
this.updateView();
|
|
289
|
+
}
|
|
290
|
+
ngOnDestroy() {
|
|
291
|
+
this.unregister();
|
|
292
|
+
}
|
|
293
|
+
unregister() {
|
|
294
|
+
this.sub?.unsubscribe();
|
|
295
|
+
}
|
|
296
|
+
updateView() {
|
|
297
|
+
this.unregister();
|
|
298
|
+
if (this.requiredPermissions || this.requiredPermissions.length) {
|
|
299
|
+
this.sub = this.authContext
|
|
300
|
+
.hasRequiredPermission(this.requiredPermissions)
|
|
301
|
+
.pipe(distinctUntilChanged())
|
|
302
|
+
.subscribe((hasPerm) => {
|
|
303
|
+
if (hasPerm) {
|
|
304
|
+
this.viewContainer.createEmbeddedView(this.templateRef);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.viewContainer.clear();
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: HasPermissionDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
313
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.9", type: HasPermissionDirective, isStandalone: true, selector: "[hasPermission]", inputs: { hasPermission: "hasPermission" }, ngImport: i0 });
|
|
314
|
+
}
|
|
315
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: HasPermissionDirective, decorators: [{
|
|
316
|
+
type: Directive,
|
|
317
|
+
args: [{
|
|
318
|
+
standalone: true,
|
|
319
|
+
selector: '[hasPermission]',
|
|
320
|
+
}]
|
|
321
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AuthContextService }], propDecorators: { hasPermission: [{
|
|
322
|
+
type: Input
|
|
323
|
+
}] } });
|
|
324
|
+
|
|
325
|
+
class HasRoleDirective {
|
|
326
|
+
templateRef;
|
|
327
|
+
viewContainer;
|
|
328
|
+
authContext;
|
|
329
|
+
requiredRoles;
|
|
330
|
+
sub;
|
|
331
|
+
constructor(templateRef, viewContainer, authContext) {
|
|
332
|
+
this.templateRef = templateRef;
|
|
333
|
+
this.viewContainer = viewContainer;
|
|
334
|
+
this.authContext = authContext;
|
|
335
|
+
}
|
|
336
|
+
set hasRole(value) {
|
|
337
|
+
this.requiredRoles = value;
|
|
338
|
+
this.updateView();
|
|
339
|
+
}
|
|
340
|
+
ngOnDestroy() {
|
|
341
|
+
this.unregister();
|
|
342
|
+
}
|
|
343
|
+
unregister() {
|
|
344
|
+
this.sub?.unsubscribe();
|
|
345
|
+
}
|
|
346
|
+
updateView() {
|
|
347
|
+
this.unregister();
|
|
348
|
+
if (this.requiredRoles || this.requiredRoles?.length) {
|
|
349
|
+
this.sub = this.authContext
|
|
350
|
+
.hasRequiredRole(this.requiredRoles)
|
|
351
|
+
.pipe(distinctUntilChanged())
|
|
352
|
+
.subscribe((hasRole) => {
|
|
353
|
+
if (hasRole) {
|
|
354
|
+
this.viewContainer.createEmbeddedView(this.templateRef);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
this.viewContainer.clear();
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: HasRoleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
363
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.9", type: HasRoleDirective, isStandalone: true, selector: "[hasRole]", inputs: { hasRole: "hasRole" }, ngImport: i0 });
|
|
364
|
+
}
|
|
365
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImport: i0, type: HasRoleDirective, decorators: [{
|
|
366
|
+
type: Directive,
|
|
367
|
+
args: [{
|
|
368
|
+
standalone: true,
|
|
369
|
+
selector: '[hasRole]',
|
|
370
|
+
}]
|
|
371
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AuthContextService }], propDecorators: { hasRole: [{
|
|
372
|
+
type: Input
|
|
373
|
+
}] } });
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Generated bundle index. Do not edit.
|
|
377
|
+
*/
|
|
378
|
+
|
|
379
|
+
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 };
|
|
380
|
+
//# 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 { EnvironmentProviders, InjectionToken, ModuleWithProviders, NgModule, Provider, inject, provideAppInitializer } 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 TokenProvider,\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 | EnvironmentProviders)[] {\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\n\r\nexport const SECURITY_INITIALIZER_PROVIDER: EnvironmentProviders = provideAppInitializer(() => {\r\n const initializerFn = (securityInitializerFactory)(inject<TokenProvider>(SECURITY_CONTEXT_TOKEN_PROVIDER), inject(AuthContextService), inject<SecurityConfig>(SECURITY_CONFIG), inject(Router));\r\n return initializerFn();\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';
|
package/{src/lib/models/authenticated-user.model.ts → lib/models/authenticated-user.model.d.ts}
RENAMED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 { EnvironmentProviders, 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 | EnvironmentProviders)[];
|
|
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: EnvironmentProviders;
|