En este tema, aprenderemos sobre los guardias de ruta en Angular, una característica esencial para controlar el acceso a las rutas en una aplicación Angular. Los guardias de ruta permiten proteger rutas específicas, asegurando que solo los usuarios autorizados puedan acceder a ellas. También pueden ser utilizados para gestionar la navegación y realizar tareas antes de que una ruta sea activada o desactivada.
¿Qué son los Guardias de Ruta?
Los guardias de ruta son servicios que implementan interfaces específicas de Angular para controlar la navegación. Estas interfaces permiten interceptar la navegación y decidir si una ruta puede ser activada, desactivada, cargada o descargada.
Tipos de Guardias de Ruta
- CanActivate: Determina si una ruta puede ser activada.
- CanActivateChild: Determina si las rutas hijas pueden ser activadas.
- CanDeactivate: Determina si una ruta puede ser desactivada.
- CanLoad: Determina si un módulo puede ser cargado de manera diferida (lazy loading).
- Resolve: Recupera datos antes de que una ruta sea activada.
Implementación de Guardias de Ruta
Paso 1: Crear un Guard
Primero, crearemos un guard utilizando Angular CLI:
Esto generará un archivo auth.guard.ts con una estructura básica.
Paso 2: Implementar la Lógica del Guard
Editaremos el archivo auth.guard.ts para implementar la lógica de nuestro guard. En este ejemplo, utilizaremos CanActivate para proteger una ruta:
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (this.authService.isLoggedIn()) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
}En este ejemplo, AuthGuard utiliza un servicio de autenticación (AuthService) para verificar si el usuario está autenticado. Si el usuario no está autenticado, se redirige a la página de inicio de sesión.
Paso 3: Aplicar el Guard a una Ruta
Ahora, aplicaremos el guard a una ruta en el archivo de configuración de rutas (app-routing.module.ts):
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
import { AuthGuard } from './auth.guard';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'login', component: LoginComponent },
{ path: 'protected', component: ProtectedComponent, canActivate: [AuthGuard] }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }En este ejemplo, la ruta protected está protegida por AuthGuard. Solo los usuarios autenticados podrán acceder a esta ruta.
Ejercicio Práctico
Ejercicio 1: Crear un Guard de Autenticación
- Objetivo: Crear un guard que proteja una ruta específica y redirija a los usuarios no autenticados a la página de inicio de sesión.
- Pasos:
- Crear un servicio de autenticación (
AuthService) que tenga un métodoisLoggedIn(). - Generar un guard (
AuthGuard) utilizando Angular CLI. - Implementar la lógica de autenticación en el guard.
- Aplicar el guard a una ruta en el archivo de configuración de rutas.
- Crear un servicio de autenticación (
Solución
- Crear el Servicio de Autenticación:
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class AuthService {
private loggedIn = false;
isLoggedIn(): boolean {
return this.loggedIn;
}
login() {
this.loggedIn = true;
}
logout() {
this.loggedIn = false;
}
}- Generar el Guard:
- Implementar la Lógica del Guard:
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (this.authService.isLoggedIn()) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
}- Aplicar el Guard a una Ruta:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
import { ProtectedComponent } from './protected/protected.component';
import { AuthGuard } from './auth.guard';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'login', component: LoginComponent },
{ path: 'protected', component: ProtectedComponent, canActivate: [AuthGuard] }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }Conclusión
En esta lección, hemos aprendido sobre los guardias de ruta en Angular y cómo utilizarlos para proteger rutas específicas en nuestra aplicación. Hemos cubierto los diferentes tipos de guardias de ruta y hemos implementado un guard de autenticación paso a paso. Los guardias de ruta son una herramienta poderosa para controlar el acceso y la navegación en aplicaciones Angular, asegurando que solo los usuarios autorizados puedan acceder a ciertas áreas de la aplicación.
En el próximo módulo, exploraremos los formularios en Angular, comenzando con los formularios basados en plantillas.
Curso de Angular 2+
Módulo 1: Introducción a Angular
- ¿Qué es Angular?
- Configuración del Entorno de Desarrollo
- Tu Primera Aplicación Angular
- Arquitectura de Angular
Módulo 2: Conceptos Básicos de TypeScript
- Introducción a TypeScript
- Variables y Tipos de Datos en TypeScript
- Funciones y Funciones Flecha
- Clases e Interfaces
Módulo 3: Componentes y Plantillas
- Creación de Componentes
- Plantillas de Componentes
- Estilos de Componentes
- Interacción entre Componentes
Módulo 4: Directivas y Pipes
Módulo 5: Servicios e Inyección de Dependencias
- Introducción a los Servicios
- Creación y Uso de Servicios
- Inyección de Dependencias
- Inyectores Jerárquicos
Módulo 6: Enrutamiento y Navegación
Módulo 7: Formularios en Angular
- Formularios Basados en Plantillas
- Formularios Reactivos
- Validación de Formularios
- Formularios Dinámicos
Módulo 8: Cliente HTTP y Observables
- Introducción al Cliente HTTP
- Realizando Solicitudes HTTP
- Manejo de Respuestas HTTP
- Uso de Observables
Módulo 9: Gestión de Estado
- Introducción a la Gestión de Estado
- Uso de Servicios para la Gestión de Estado
- NgRx Store
- NgRx Effects
