WhatsApp

  
Implementación de AuthGuard para Definir Permisos de Acceso en Angular

Introducción

En el emocionante mundo del desarrollo web, la seguridad y la gestión de acceso son aspectos críticos que no deben pasarse por alto. A medida que nuestras aplicaciones web crecen en complejidad y alcance, la necesidad de garantizar que los usuarios tengan acceso solo a las partes de la aplicación que les corresponden se vuelve más evidente. En este contexto, la implementación de un AuthGuard en Angular emerge como una herramienta fundamental para lograr este propósito.

Un AuthGuard es una característica esencial que permite controlar quién puede acceder a qué en tu aplicación Angular. Ya sea que estés desarrollando una aplicación empresarial, una plataforma de comercio electrónico o cualquier otro tipo de aplicación web, la gestión adecuada de permisos y roles se convierte en una necesidad crítica para proteger los datos, garantizar la privacidad y proporcionar una experiencia de usuario segura y coherente.

Paso 1: Configuración del Proyecto

Asegúrate de tener Angular CLI instalado en tu sistema. Si no lo tienes, puedes instalarlo globalmente ejecutando el siguiente comando: npm install -g @angular/cli

Luego, crea un nuevo proyecto Angular con el siguiente comando: ng new mi-proyecto


Paso 2: Creación de un Servicio de Autenticación

Generemos un servicio de autenticación simple para simular la autenticación. Ejecuta el siguiente comando para generar un servicio llamado auth: ng generate service auth

Luego, en src/app/auth.service.ts, implementa la lógica de autenticación básica junto con la gestión de roles parametrizados:

import { Injectable } from '@angular/core';

@Injectable({
providedIn: 'root'
})
export class AuthService {
private isAuthenticated = false;
private userRoles: string[] = [];

login(username: string, password: string) {
// Simula una autenticación exitosa.
this.isAuthenticated = true;
// Simula roles del usuario (puedes obtener estos roles del servidor).
this.userRoles = ['user'];
}

logout() {
// Simula un cierre de sesión.
this.isAuthenticated = false;
this.userRoles = [];
}

isAuthenticatedUser(): boolean {
return this.isAuthenticated;
}

hasRole(role: string): boolean {
return this.userRoles.includes(role);
}}


Paso 3: Creación del Archivo de Roles

Crea un archivo roles.ts en la carpeta src/app para definir los roles permitidos. Puedes personalizar esta lista según tus necesidades:

// src/app/roles.ts

export const ROLES = {
USER: 'user',
ADMIN: 'admin'
};



Paso 4: Creación del AuthGuard para Definir Permisos de Acceso

Vamos a crear un AuthGuard personalizado para definir permisos de acceso a rutas. Ejecuta el siguiente comando: ng generate guard auth

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { AuthService } from './auth.service';
import { ROLES } from './roles';
Luego, en src/app/auth.guard.ts, importa los roles desde el archivo roles.ts y define permisos de acceso parametrizados en cada ruta:
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {

constructor(private authService: AuthService) {}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
if (this.authService.isAuthenticatedUser()) {
// Define permisos de acceso para cada ruta.
const allowedRoles = route.data['roles'] as string[];
if (!allowedRoles || allowedRoles.length === 0 || allowedRoles.some(role => this.authService.hasRole(role))) {
return true;
}
}
// Redirige al usuario a la página de inicio de sesión si no tiene acceso.
// Puedes usar window.location.href o router.navigate según tus necesidades.
window.location.href = '/login';
return false;
}
}






Paso 5: Configuración de Rutas con Permisos de Acceso

Configura tus rutas en src/app/app-routing.module.ts y asigna permisos de acceso a las rutas que deseas proteger. Ahora, puedes parametrizar los permisos de acceso utilizando los roles definidos en roles.ts:


import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component'; // Asegúrate de tener el componente "Home" en tu proyecto.
import { LoginComponent } from './login/login.component'; // Asegúrate de tener el componente "Login" en tu proyecto.
import { DashboardComponent } from './dashboard/dashboard.component'; // Asegúrate de tener el componente "Dashboard" en tu proyecto.
import { AuthGuard } from './auth.guard';
import { ROLES } from './roles';

const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'login', component: LoginComponent },
// Define permisos de acceso para cada ruta.
{ path: 'dashboard', canActivate: [AuthGuard], data: { roles: [ROLES.USER, ROLES.ADMIN] }, component: DashboardComponent },
// Agrega más rutas y asigna permisos de acceso según sea necesario.
];

@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }


Paso 6: Uso en Componentes

En tus componentes, puedes usar el AuthGuard con permisos de acceso para proteger rutas específicas. Por ejemplo, en el componente dashboard, puedes agregar la protección de autenticación y permisos de acceso:

import { Component } from '@angular/core';
import { AuthService } from '../auth.service';

@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent {

constructor(private authService: AuthService) { }

// Debería ser una función para iniciar sesión en lugar de cerrarla.
login() {
this.authService.login(username, password); // Aquí deberías incluir lógica de inicio de sesión si es necesario.
}
}


Conclusión

Hemos implementado con éxito un AuthGuard en nuestra aplicación Angular para definir permisos de acceso a rutas específicas. Utilizamos roles predefinidos que pueden personalizarse según las necesidades del proyecto. Este enfoque brinda mayor seguridad y control sobre las funcionalidades a las que pueden acceder los usuarios. ¡Esperamos que este tutorial te haya sido útil en la implementación de permisos de acceso en tu aplicación web!



Empiece a escribir aquí...


Implementación de AuthGuard para Definir Permisos de Acceso en Angular
Luis Alberto González Trejo 29 septiembre, 2023
Compartir
Categorías


Iniciar sesión dejar un comentario

  
Navega sin Perder el Rumbo: Enrutamiento con Angular