import { inject } from '@angular/core'; import { CanActivateFn, Router } from '@angular/router'; import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router'; import { DirectAuthService } from '../services/direct-auth.service'; /** * Guard combinado que verifica si el usuario tiene los roles y/o pertenece a los grupos requeridos * Espera un array de roles en route.data['roles'] y/o un array de grupos en route.data['groups'] * El parámetro route.data['requireAll'] determina si se requieren todos los roles/grupos o solo alguno * Si no cumple con los requisitos, redirige a la página de acceso denegado */ export const accessGuard: CanActivateFn = ( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): boolean | UrlTree => { const authService = inject(DirectAuthService); const router = inject(Router); // Primero verificar si está autenticado if (!authService.isAuthenticated()) { return router.createUrlTree(['/login'], { queryParams: { returnUrl: state.url } }); } // Obtener los roles y grupos requeridos del data de la ruta const requiredRoles = route.data['roles'] as Array || []; const requiredGroups = route.data['groups'] as Array || []; const requireAll = route.data['requireAll'] as boolean || false; // Si no hay roles ni grupos requeridos, permitir acceso if (requiredRoles.length === 0 && requiredGroups.length === 0) { return true; } // Verificar acceso según la configuración let hasAccess = false; if (requireAll) { // Necesita cumplir TODOS los requisitos let hasRequiredRoles = true; let hasRequiredGroups = true; if (requiredRoles.length > 0) { hasRequiredRoles = authService.hasAllRoles(requiredRoles); } if (requiredGroups.length > 0) { hasRequiredGroups = authService.inAllGroups(requiredGroups); } hasAccess = hasRequiredRoles && hasRequiredGroups; } else { // Necesita cumplir ALGUNO de los requisitos hasAccess = (requiredRoles.length > 0 && authService.hasAnyRole(requiredRoles)) || (requiredGroups.length > 0 && authService.inAnyGroup(requiredGroups)); } if (hasAccess) { return true; } // Si no cumple los requisitos, redirigir a página de acceso denegado return router.createUrlTree(['/access-denied']); };