@nebular/security
Version:
@nebular/security
1 lines • 16.3 kB
Source Map (JSON)
{"version":3,"file":"nebular-security.mjs","sources":["../../../src/framework/security/security.options.ts","../../../src/framework/security/services/acl.service.ts","../../../src/framework/security/services/role.provider.ts","../../../src/framework/security/services/access-checker.service.ts","../../../src/framework/security/directives/is-granted.directive.ts","../../../src/framework/security/security.module.ts","../../../src/framework/security/public_api.ts","../../../src/framework/security/nebular-security.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface NbAclRole {\n parent?: string,\n [permission: string]: string|string[]|undefined,\n}\n\nexport interface NbAccessControl {\n [role: string]: NbAclRole,\n}\n\nexport interface NbAclOptions {\n accessControl?: NbAccessControl,\n}\n\nexport const NB_SECURITY_OPTIONS_TOKEN = new InjectionToken<NbAclOptions>('Nebular Security Options');\n","/**\n * @license\n * Copyright Akveo. All Rights Reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n */\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { NB_SECURITY_OPTIONS_TOKEN, NbAclOptions, NbAclRole, NbAccessControl } from '../security.options';\n\nconst shallowObjectClone = (o) => Object.assign({}, o);\nconst shallowArrayClone = (a) => Object.assign([], a);\nconst popParent = (abilities) => {\n const parent = abilities.parent;\n delete abilities.parent;\n return parent;\n};\n\n/**\n * Common acl service.\n */\n@Injectable()\nexport class NbAclService {\n private static readonly ANY_RESOURCE = '*';\n\n private state: NbAccessControl = {};\n\n constructor(@Optional() @Inject(NB_SECURITY_OPTIONS_TOKEN) protected settings: NbAclOptions = {}) {\n if (settings.accessControl) {\n this.setAccessControl(settings.accessControl);\n }\n }\n\n /**\n * Set/Reset ACL list\n * @param {NbAccessControl} list\n */\n setAccessControl(list: NbAccessControl) {\n for (const [role, value] of Object.entries(list)) {\n const abilities = shallowObjectClone(value);\n const parent = popParent(abilities);\n this.register(role, parent, abilities);\n }\n }\n\n /**\n * Register a new role with a list of abilities (permission/resources combinations)\n * @param {string} role\n * @param {string} parent\n * @param {[permission: string]: string|string[]} abilities\n */\n register(role: string, parent: string = null, abilities: { [permission: string]: string | string[] } = {}) {\n this.validateRole(role);\n\n this.state[role] = {\n parent: parent,\n };\n\n for (const [permission, value] of Object.entries(abilities)) {\n const resources = typeof value === 'string' ? [value] : value;\n this.allow(role, permission, shallowArrayClone(resources));\n }\n }\n\n /**\n * Allow a permission for specific resources to a role\n * @param {string} role\n * @param {string} permission\n * @param {string | string[]} resource\n */\n allow(role: string, permission: string, resource: string | string[]) {\n this.validateRole(role);\n\n if (!this.getRole(role)) {\n this.register(role, null, {});\n }\n\n resource = typeof resource === 'string' ? [resource] : resource;\n\n let resources = shallowArrayClone(this.getRoleResources(role, permission));\n resources = resources.concat(resource);\n\n this.state[role][permission] = resources.filter((item, pos) => resources.indexOf(item) === pos);\n }\n\n /**\n * Check whether the role has a permission to a resource\n * @param {string} role\n * @param {string} permission\n * @param {string} resource\n * @returns {boolean}\n */\n can(role: string, permission: string, resource: string) {\n this.validateResource(resource);\n\n const parentRole = this.getRoleParent(role);\n const parentCan = parentRole && this.can(this.getRoleParent(role), permission, resource);\n return parentCan || this.exactCan(role, permission, resource);\n }\n\n private getRole(role: string): NbAclRole {\n return this.state[role];\n }\n\n private validateRole(role: string) {\n if (!role) {\n throw new Error('NbAclService: role name cannot be empty');\n }\n }\n\n private validateResource(resource: string) {\n if (!resource || [NbAclService.ANY_RESOURCE].includes(resource)) {\n throw new Error(`NbAclService: cannot use empty or bulk '*' resource placeholder with 'can' method`);\n }\n }\n\n private exactCan(role: string, permission: string, resource: string) {\n const resources = this.getRoleResources(role, permission);\n return resources.includes(resource) || resources.includes(NbAclService.ANY_RESOURCE);\n }\n\n private getRoleResources(role: string, permission: string): string[] {\n return this.getRoleAbilities(role)[permission] || [];\n }\n\n private getRoleAbilities(role: string): { [permission: string]: string[] } {\n const abilities = shallowObjectClone(this.state[role] || {});\n popParent(shallowObjectClone(this.state[role] || {}));\n return abilities;\n }\n\n private getRoleParent(role: string): string {\n return this.state[role] ? this.state[role].parent : null;\n }\n}\n","/**\n * @license\n * Copyright Akveo. All Rights Reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n */\nimport { Observable } from 'rxjs';\n\nexport abstract class NbRoleProvider {\n\n /**\n * Returns current user role\n * @returns {Observable<string | string[]>}\n */\n abstract getRole(): Observable<string|string[]>;\n}\n","/**\n * @license\n * Copyright Akveo. All Rights Reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n */\nimport { Injectable } from '@angular/core';\nimport { NbRoleProvider } from './role.provider';\nimport { NbAclService } from './acl.service';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n/**\n * Access checker service.\n *\n * Injects `NbRoleProvider` to determine current user role, and checks access permissions using `NbAclService`\n */\n@Injectable()\nexport class NbAccessChecker {\n\n constructor(protected roleProvider: NbRoleProvider, protected acl: NbAclService) {\n }\n\n /**\n * Checks whether access is granted or not\n *\n * @param {string} permission\n * @param {string} resource\n * @returns {Observable<boolean>}\n */\n isGranted(permission: string, resource: string): Observable<boolean> {\n return this.roleProvider.getRole()\n .pipe(\n map((role: string|string[]) => Array.isArray(role) ? role : [role]),\n map((roles: string[]) => {\n return roles.some(role => this.acl.can(role, permission, resource));\n }),\n );\n }\n}\n","import { Directive, Input, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport { NbAccessChecker } from '../services/access-checker.service';\n\n@Directive({\n selector: '[nbIsGranted]',\n standalone: false\n})\nexport class NbIsGrantedDirective implements OnDestroy {\n\n private destroy$ = new Subject<void>();\n\n private hasView = false;\n\n constructor(private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef,\n private accessChecker: NbAccessChecker) {\n }\n\n @Input() set nbIsGranted([permission, resource]: [string, string]) {\n\n this.accessChecker.isGranted(permission, resource)\n .pipe(\n takeUntil(this.destroy$),\n )\n .subscribe((can: boolean) => {\n if (can && !this.hasView) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView = true;\n } else if (!can && this.hasView) {\n this.viewContainer.clear();\n this.hasView = false;\n }\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { NB_SECURITY_OPTIONS_TOKEN, NbAclOptions } from './security.options';\nimport { NbAclService } from './services/acl.service';\nimport { NbAccessChecker } from './services/access-checker.service';\nimport { NbIsGrantedDirective } from './directives/is-granted.directive';\n\n@NgModule({\n imports: [\n CommonModule,\n ],\n declarations: [\n NbIsGrantedDirective,\n ],\n exports: [\n NbIsGrantedDirective,\n ],\n})\nexport class NbSecurityModule {\n static forRoot(nbSecurityOptions?: NbAclOptions): ModuleWithProviders<NbSecurityModule> {\n return {\n ngModule: NbSecurityModule,\n providers: [\n { provide: NB_SECURITY_OPTIONS_TOKEN, useValue: nbSecurityOptions },\n NbAclService,\n NbAccessChecker,\n ],\n };\n }\n}\n","/**\n * @license\n * Copyright Akveo. All Rights Reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n */\nexport * from './security.options';\nexport * from './security.module';\nexport * from './services/acl.service';\nexport * from './services/access-checker.service';\nexport * from './services/role.provider';\nexport * from './directives/is-granted.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.NbRoleProvider","i2.NbAclService","i1.NbAccessChecker"],"mappings":"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"}