UNPKG

@universis/common

Version:

Universis - common directives and services

114 lines (113 loc) 14.1 kB
import { Inject, Injectable, InjectionToken } from '@angular/core'; import { Router } from '@angular/router'; import { UserService } from '../services/user.service'; import { Observable } from 'rxjs'; import { ErrorService } from '../../error/error.service'; import { ConfigurationService } from '../../shared/services/configuration.service'; export let APP_LOCATIONS = new InjectionToken('app.locations'); export const DEFAULT_APP_LOCATIONS = [{ privilege: 'Location', target: { url: '^/auth/' }, mask: 1 }, { privilege: 'Location', target: { url: '^/error' }, mask: 1 } ]; export class AuthGuard { constructor(_router, _locations, _errorService, _configurationService, _userService) { this._router = _router; this._locations = _locations; this._errorService = _errorService; this._configurationService = _configurationService; this._userService = _userService; // merge app locations, if any if (this._configurationService.settings && this._configurationService.settings.auth) { // get extra locations const appLocations = this._configurationService.settings.auth.locations; if (Array.isArray(appLocations)) { // get APP_LOCATIONS if (this._locations) { this._locations.unshift.apply(this._locations, appLocations); } } } this._locations.forEach((x) => { if (typeof x.target.pattern === 'undefined' || x.target.pattern === null) { x.target.pattern = new RegExp(x.target.url, 'i'); } }); } canActivateLocation(path, user) { let groups = []; if (user && user.groups) { groups = user.groups.map((x) => { return x.name; }); } return this._locations.find((x) => { return x.target.pattern.test(path) && (typeof x.account === 'undefined' || groups.indexOf(x.account.name) >= 0) && (x.mask === 0 || ((x.mask & 1) === 1)) && user; }); } canActivate(route, state) { return this._canActivate(state); } canActivateChild(childRoute, state) { return this._canActivate(state); } _canActivate(state) { return new Observable(resolve => { this._userService.getUser().then((res) => { const location = this.canActivateLocation(state.url, res); if (location && (typeof location.account === 'undefined')) { return resolve.next(true); } if (res) { if (location && (location.mask & 1) === 1) { return resolve.next(true); } else { if (location && location.redirectTo) { this._router.navigate([location.redirectTo]); return resolve.next(false); } // noinspection JSIgnoredPromiseFromCall this._router.navigate(['/error/403.1'], { queryParams: { action: 'Error.LoginAsDiffrentUser', continue: '/auth/loginAs' } }); return resolve.next(false); } } // noinspection JSIgnoredPromiseFromCall this._router.navigate(['/auth/login'], { queryParams: { continue: state.url } }); return resolve.next(false); }); }); } } AuthGuard.decorators = [ { type: Injectable } ]; /** @nocollapse */ AuthGuard.ctorParameters = () => [ { type: Router }, { type: Array, decorators: [{ type: Inject, args: [APP_LOCATIONS,] }] }, { type: ErrorService }, { type: ConfigurationService }, { type: UserService } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvY29tbW9uLyIsInNvdXJjZXMiOlsiYXV0aC9ndWFyZHMvYXV0aC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUF3RCxNQUFNLEVBQXNCLE1BQU0saUJBQWlCLENBQUM7QUFDbkgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBR2pGLE1BQU0sQ0FBQyxJQUFJLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDO1FBQ2xDLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLE1BQU0sRUFBRTtZQUNKLEdBQUcsRUFBRSxTQUFTO1NBQ2pCO1FBQ0QsSUFBSSxFQUFFLENBQUM7S0FDUjtJQUNEO1FBQ0UsU0FBUyxFQUFFLFVBQVU7UUFDckIsTUFBTSxFQUFFO1lBQ0osR0FBRyxFQUFFLFNBQVM7U0FDakI7UUFDRCxJQUFJLEVBQUUsQ0FBQztLQUNSO0NBQ0YsQ0FBQztBQUdGLE1BQU07SUFFSixZQUFvQixPQUFlLEVBQ0YsVUFBcUMsRUFDNUQsYUFBMkIsRUFDM0IscUJBQTJDLEVBQzNDLFlBQXlCO1FBSmYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNGLGVBQVUsR0FBVixVQUFVLENBQTJCO1FBQzVELGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDM0MsaUJBQVks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bmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkLCBSb3V0ZXIsIFJvdXRlclN0YXRlU25hcHNob3R9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9lcnJvci9lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtMb2NhdGlvblBlcm1pc3Npb259IGZyb20gJy4vYXV0aC5ndWFyZC5pbnRlcmZhY2VzJztcblxuZXhwb3J0IGxldCBBUFBfTE9DQVRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdhcHAubG9jYXRpb25zJyk7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FQUF9MT0NBVElPTlMgPSBbe1xuICAgIHByaXZpbGVnZTogJ0xvY2F0aW9uJyxcbiAgICB0YXJnZXQ6IHtcbiAgICAgICAgdXJsOiAnXi9hdXRoLydcbiAgICB9LFxuICAgIG1hc2s6IDFcbiAgfSxcbiAge1xuICAgIHByaXZpbGVnZTogJ0xvY2F0aW9uJyxcbiAgICB0YXJnZXQ6IHtcbiAgICAgICAgdXJsOiAnXi9lcnJvcidcbiAgICB9LFxuICAgIG1hc2s6IDFcbiAgfVxuXTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICBASW5qZWN0KEFQUF9MT0NBVElPTlMpIHByaXZhdGUgX2xvY2F0aW9uczogQXJyYXk8TG9jYXRpb25QZXJtaXNzaW9uPixcbiAgICBwcml2YXRlIF9lcnJvclNlcnZpY2U6IEVycm9yU2VydmljZSxcbiAgICBwcml2YXRlIF9jb25maWd1cmF0aW9uU2VydmljZTogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlKSB7XG5cbiAgICAvLyBtZXJnZSBhcHAgbG9jYXRpb25zLCBpZiBhbnlcbiAgICBpZiAodGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2Uuc2V0dGluZ3MgJiYgdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2Uuc2V0dGluZ3MuYXV0aCkge1xuICAgICAgLy8gZ2V0IGV4dHJhIGxvY2F0aW9uc1xuICAgICAgY29uc3QgYXBwTG9jYXRpb25zID0gdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2Uuc2V0dGluZ3MuYXV0aC5sb2NhdGlvbnM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcHBMb2NhdGlvbnMpKSB7XG4gICAgICAgIC8vIGdldCBBUFBfTE9DQVRJT05TXG4gICAgICAgIGlmICh0aGlzLl9sb2NhdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLl9sb2NhdGlvbnMudW5zaGlmdC5hcHBseSh0aGlzLl9sb2NhdGlvbnMsIGFwcExvY2F0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbG9jYXRpb25zLmZvckVhY2goKHgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgeC50YXJnZXQucGF0dGVybiA9PT0gJ3VuZGVmaW5lZCcgfHwgeC50YXJnZXQucGF0dGVybiA9PT0gbnVsbCkge1xuICAgICAgICB4LnRhcmdldC5wYXR0ZXJuID0gbmV3IFJlZ0V4cCh4LnRhcmdldC51cmwsICdpJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2FuQWN0aXZhdGVMb2NhdGlvbihwYXRoOiBzdHJpbmcsIHVzZXI6IGFueSk6IExvY2F0aW9uUGVybWlzc2lvbiB7XG5cbiAgICBsZXQgZ3JvdXBzID0gW107XG4gICAgaWYgKHVzZXIgJiYgdXNlci5ncm91cHMpIHtcbiAgICAgIGdyb3VwcyA9IHVzZXIuZ3JvdXBzLm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geC5uYW1lO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbnMuZmluZCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHgudGFyZ2V0LnBhdHRlcm4udGVzdChwYXRoKVxuICAgICAgICAmJiAodHlwZW9mIHguYWNjb3VudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZ3JvdXBzLmluZGV4T2YoeC5hY2NvdW50Lm5hbWUpID49IDApXG4gICAgICAgICYmICh4Lm1hc2sgPT09IDAgfHwgKCh4Lm1hc2sgJiAxKSA9PT0gMSkpXG4gICAgICAgICYmIHVzZXI7XG4gICAgfSk7XG5cbiAgfVxuXG5cbiAgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5BY3RpdmF0ZShzdGF0ZSk7XG4gIH1cblxuICBjYW5BY3RpdmF0ZUNoaWxkKGNoaWxkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuQWN0aXZhdGUoc3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FuQWN0aXZhdGUoc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5fdXNlclNlcnZpY2UuZ2V0VXNlcigpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuY2FuQWN0aXZhdGVMb2NhdGlvbihzdGF0ZS51cmwsIHJlcyk7XG4gICAgICAgIGlmIChsb2NhdGlvbiAmJiAodHlwZW9mIGxvY2F0aW9uLmFjY291bnQgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlLm5leHQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGlmIChsb2NhdGlvbiAmJiAobG9jYXRpb24ubWFzayAmIDEpID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZS5uZXh0KHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gJiYgbG9jYXRpb24ucmVkaXJlY3RUbykge1xuICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW2xvY2F0aW9uLnJlZGlyZWN0VG9dKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNJZ25vcmVkUHJvbWlzZUZyb21DYWxsXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycvZXJyb3IvNDAzLjEnXSwge1xuICAgICAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ0Vycm9yLkxvZ2luQXNEaWZmcmVudFVzZXInLFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAnL2F1dGgvbG9naW5BcydcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZS5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTSWdub3JlZFByb21pc2VGcm9tQ2FsbFxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycvYXV0aC9sb2dpbiddLCB7IHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICBjb250aW51ZTogc3RhdGUudXJsXG4gICAgICAgICAgfX0pO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZS5uZXh0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=