This commit is contained in:
luis cespedes 2025-05-22 09:52:40 -04:00
parent 04b7840341
commit 89e97a3634
7 changed files with 105 additions and 118 deletions

View File

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

View File

@ -7,25 +7,22 @@ import { DirectAuthService } from '../services/direct-auth.service';
* Guard que verifica si el usuario es administrador * Guard que verifica si el usuario es administrador
* Si no es administrador, redirige a la página de acceso denegado * Si no es administrador, redirige a la página de acceso denegado
*/ */
export const adminGuard: CanActivateFn = ( export const adminGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree => {
route: ActivatedRouteSnapshot, const authService = inject(DirectAuthService);
state: RouterStateSnapshot const router = inject(Router);
): boolean | UrlTree => {
const authService = inject(DirectAuthService); // Primero verificar si está autenticado
const router = inject(Router); if (!authService.isAuthenticated()) {
return router.createUrlTree(['/login'], {
// Primero verificar si está autenticado queryParams: { returnUrl: state.url }
if (!authService.isAuthenticated()) { });
return router.createUrlTree(['/login'], { }
queryParams: { returnUrl: state.url }
}); // Verificar si es administrador
} if (authService.isAdmin()) {
return true;
// Verificar si es administrador }
if (authService.isAdmin()) {
return true; // Si no es administrador, redirigir a página de acceso denegado
} return router.createUrlTree(['/access-denied']);
// Si no es administrador, redirigir a página de acceso denegado
return router.createUrlTree(['/access-denied']);
}; };

View File

@ -7,10 +7,7 @@ import { DirectAuthService } from '../services/direct-auth.service';
* Guard que verifica si el usuario está autenticado * Guard que verifica si el usuario está autenticado
* Si el usuario no está autenticado, redirige al login con la URL de retorno * Si el usuario no está autenticado, redirige al login con la URL de retorno
*/ */
export const authGuard: CanActivateFn = ( export const authGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree => {
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): boolean | UrlTree => {
const authService = inject(DirectAuthService); const authService = inject(DirectAuthService);
const router = inject(Router); const router = inject(Router);
@ -19,7 +16,7 @@ export const authGuard: CanActivateFn = (
} }
// Si no está autenticado, redirigir a login con la URL de retorno // Si no está autenticado, redirigir a login con la URL de retorno
return router.createUrlTree(['/login'], { return router.createUrlTree(['/login'], {
queryParams: { returnUrl: state.url } queryParams: { returnUrl: state.url }
}); });
}; };

View File

@ -8,33 +8,30 @@ import { DirectAuthService } from '../services/direct-auth.service';
* Espera un array de grupos en route.data['groups'] * Espera un array de grupos en route.data['groups']
* Si no pertenece a los grupos necesarios, redirige a la página de acceso denegado * Si no pertenece a los grupos necesarios, redirige a la página de acceso denegado
*/ */
export const groupGuard: CanActivateFn = ( export const groupGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree => {
route: ActivatedRouteSnapshot, const authService = inject(DirectAuthService);
state: RouterStateSnapshot const router = inject(Router);
): boolean | UrlTree => {
const authService = inject(DirectAuthService); // Primero verificar si está autenticado
const router = inject(Router); if (!authService.isAuthenticated()) {
return router.createUrlTree(['/login'], {
// Primero verificar si está autenticado queryParams: { returnUrl: state.url }
if (!authService.isAuthenticated()) { });
return router.createUrlTree(['/login'], { }
queryParams: { returnUrl: state.url }
}); // Obtener los grupos requeridos del data de la ruta
} const requiredGroups = route.data['groups'] as Array<string>;
// Obtener los grupos requeridos del data de la ruta // Si no hay grupos requeridos, permitir acceso
const requiredGroups = route.data['groups'] as Array<string>; if (!requiredGroups || requiredGroups.length === 0) {
return true;
// Si no hay grupos requeridos, permitir acceso }
if (!requiredGroups || requiredGroups.length === 0) {
return true; // Usar la función de servicio para verificar grupos
} if (authService.inAnyGroup(requiredGroups)) {
return true;
// Usar la función de servicio para verificar grupos }
if (authService.inAnyGroup(requiredGroups)) {
return true; // Si no pertenece a los grupos necesarios, redirigir a página de acceso denegado
} return router.createUrlTree(['/access-denied']);
// Si no pertenece a los grupos necesarios, redirigir a página de acceso denegado
return router.createUrlTree(['/access-denied']);
}; };

View File

@ -8,33 +8,30 @@ import { DirectAuthService } from '../services/direct-auth.service';
* Espera un array de roles en route.data['roles'] * Espera un array de roles en route.data['roles']
* Si no tiene los roles necesarios, redirige a la página de acceso denegado * Si no tiene los roles necesarios, redirige a la página de acceso denegado
*/ */
export const roleGuard: CanActivateFn = ( export const roleGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree => {
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): boolean | UrlTree => {
const authService = inject(DirectAuthService); const authService = inject(DirectAuthService);
const router = inject(Router); const router = inject(Router);
// Primero verificar si está autenticado // Primero verificar si está autenticado
if (!authService.isAuthenticated()) { if (!authService.isAuthenticated()) {
return router.createUrlTree(['/login'], { return router.createUrlTree(['/login'], {
queryParams: { returnUrl: state.url } queryParams: { returnUrl: state.url }
}); });
} }
// Obtener los roles requeridos del data de la ruta // Obtener los roles requeridos del data de la ruta
const requiredRoles = route.data['roles'] as Array<string>; const requiredRoles = route.data['roles'] as Array<string>;
// Si no hay roles requeridos, permitir acceso // Si no hay roles requeridos, permitir acceso
if (!requiredRoles || requiredRoles.length === 0) { if (!requiredRoles || requiredRoles.length === 0) {
return true; return true;
} }
// Usar la función de servicio para verificar roles // Usar la función de servicio para verificar roles
if (authService.hasAnyRole(requiredRoles)) { if (authService.hasAnyRole(requiredRoles)) {
return true; return true;
} }
// Si no tiene los roles necesarios, redirigir a página de acceso denegado // Si no tiene los roles necesarios, redirigir a página de acceso denegado
return router.createUrlTree(['/access-denied']); return router.createUrlTree(['/access-denied']);
}; };

View File

@ -21,6 +21,6 @@ export const environment = {
// Intervalo de log en milisegundos (1 segundo) // Intervalo de log en milisegundos (1 segundo)
logInterval: 2000, logInterval: 2000,
// Habilitar logs de inactividad // Habilitar logs de inactividad
enableActivityLogs: true enableActivityLogs: false
} }
}; };

View File

@ -735,7 +735,9 @@ Alternativamente, puedes crear un mapper de tipo "User Attribute" si prefieres a
![configuracion maper](https://i.ibb.co/TqWHYYjX/imagen.png) ![configuracion maper](https://i.ibb.co/TqWHYYjX/imagen.png)
¿Qué logramos con esto? Fácil: que en el access token aparezcan los grupos a los que pertenece el usuario, tal cual los configuramos en LDAP. Esto puede ayudar para crear políticas de acceso a páginas o rutas protegidas para algún grupo en específico más adelante. ![ejemplo json acces token ](https://i.ibb.co/jPrR0XH3/imagen.png) ¿Qué logramos con esto? Fácil: que en el access token aparezcan los grupos a los que pertenece el usuario, tal cual los configuramos en LDAP. Esto puede ayudar para crear políticas de acceso a páginas o rutas protegidas para algún grupo en específico más adelante.
![ejemplo json acces token ](https://i.ibb.co/jPrR0XH3/imagen.png)
## 11. Arquitectura del sistema ## 11. Arquitectura del sistema