UNPKG

ng-secure-access

Version:

Librairie Angular pour la gestion des permissions d'accès aux routes et l'affichage conditionnel basé sur les permissions utilisateur

1 lines 10.6 kB
{"version":3,"file":"ng-secure-access.mjs","sources":["../../../projects/ng-secure-access/src/lib/permission.service.ts","../../../projects/ng-secure-access/src/lib/has-permission.directive.ts","../../../projects/ng-secure-access/src/lib/permission.guard.ts","../../../projects/ng-secure-access/src/public-api.ts","../../../projects/ng-secure-access/src/ng-secure-access.ts"],"sourcesContent":["import {Injectable, signal, WritableSignal, computed} from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PermissionService {\r\n // Signaux privés\r\n private permissions: WritableSignal<string[]> = signal<string[]>([]);\r\n private permissionsLoaded: WritableSignal<boolean> = signal(false);\r\n\r\n // Signaux publics computed (readonly)\r\n public readonly permissions$ = computed(() => this.permissions());\r\n public readonly permissionsLoaded$ = computed(() => this.permissionsLoaded());\r\n\r\n // Charger les permissions\r\n loadPermissions(permissions: string[]): void {\r\n this.permissions.set(permissions);\r\n this.permissionsLoaded.set(true);\r\n }\r\n\r\n // Vérifier si l'utilisateur possède AU MOINS une des permissions (OU logique)\r\n hasPermission(requiredPermissions: string[]): boolean {\r\n if (!requiredPermissions || requiredPermissions.length === 0) {\r\n return true;\r\n }\r\n return requiredPermissions.some(permission => this.permissions().includes(permission));\r\n }\r\n\r\n // Obtenir toutes les permissions\r\n getPermissions(): string[] {\r\n return this.permissions();\r\n }\r\n\r\n // Vérifier si les permissions sont chargées\r\n arePermissionsLoaded(): boolean {\r\n return this.permissionsLoaded();\r\n }\r\n\r\n // Effacer les permissions (déconnexion)\r\n clearPermissions(): void {\r\n this.permissions.set([]);\r\n this.permissionsLoaded.set(false);\r\n }\r\n\r\n // Ajouter une permission dynamiquement\r\n addPermission(permission: string): void {\r\n if (!this.permissions().includes(permission)) {\r\n this.permissions.update(perms => [...perms, permission]);\r\n }\r\n }\r\n\r\n // Retirer une permission\r\n removePermission(permission: string): void {\r\n this.permissions.update(perms => perms.filter(p => p !== permission));\r\n }\r\n\r\n // Vérifier une permission spécifique\r\n hasSpecificPermission(permission: string): boolean {\r\n return this.permissions().includes(permission);\r\n }\r\n}\r\n","import {Directive, Input, TemplateRef, ViewContainerRef} from '@angular/core';\r\nimport {PermissionService} from \"./permission.service\";\r\n\r\n@Directive({\r\n selector: '[hasPermission]',\r\n standalone: true\r\n})\r\nexport class HasPermissionDirective {\r\n private permissionsRequired: string[] = [];\r\n\r\n constructor(\r\n private templateRef: TemplateRef<any>,\r\n private viewContainer: ViewContainerRef,\r\n private permissionService: PermissionService\r\n ) {}\r\n\r\n @Input() set hasPermission(permissions: string[]) {\r\n this.permissionsRequired = permissions;\r\n this.updateView();\r\n }\r\n\r\n private updateView(): void {\r\n if (this.checkPermissions()) {\r\n // Affiche l'élément si au moins une permission est présente\r\n this.viewContainer.createEmbeddedView(this.templateRef);\r\n } else {\r\n // Masque l'élément\r\n this.viewContainer.clear();\r\n }\r\n }\r\n\r\n private checkPermissions(): boolean {\r\n // Vérifie si l'utilisateur a au moins une des permissions requises\r\n return this.permissionService.hasPermission(this.permissionsRequired);\r\n }\r\n}\r\n","import {inject, Injectable} from '@angular/core';\r\nimport {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from '@angular/router';\r\nimport {PermissionService} from './permission.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PermissionGuard implements CanActivate {\r\n private permissionService = inject(PermissionService);\r\n private router = inject(Router);\r\n\r\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n const requiredPermissions = route.data['permissions'] as string[];\r\n const redirectTo = route.data['redirectTo'] || '/access-denied';\r\n\r\n // Vérifier si des permissions sont spécifiées\r\n if (!requiredPermissions || requiredPermissions.length === 0) {\r\n console.warn('[PermissionGuard] Aucune permission requise pour cette route:', state.url);\r\n return true;\r\n }\r\n\r\n // Vérifier si les permissions sont chargées\r\n if (!this.permissionService.arePermissionsLoaded()) {\r\n console.error('[PermissionGuard] Les permissions ne sont pas encore chargées');\r\n this.router.navigate([redirectTo], {\r\n queryParams: { returnUrl: state.url }\r\n });\r\n return false;\r\n }\r\n\r\n // Vérifier les permissions (OU logique : au moins une permission requise)\r\n if (this.permissionService.hasPermission(requiredPermissions)) {\r\n return true;\r\n }\r\n\r\n // Log de l'accès refusé\r\n console.warn(\r\n '[PermissionGuard] Accès refusé à:', state.url,\r\n '\\nPermissions requises (au moins une):', requiredPermissions,\r\n '\\nPermissions utilisateur:', this.permissionService.getPermissions()\r\n );\r\n\r\n // Redirection avec l'URL de retour\r\n this.router.navigate([redirectTo], {\r\n queryParams: { returnUrl: state.url }\r\n });\r\n\r\n return false;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-secure-access\r\n */\r\nexport * from './lib/permission.service';\r\nexport * from './lib/has-permission.directive';\r\nexport * from './lib/permission.guard';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.PermissionService"],"mappings":"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"}