Aula 13

Angular

Guardião de Rotas

Guarda de Rotas

As Guardas de Rotas no Angular permitem controlar o acesso a determinadas rotas com base em condições, como autenticação e permissões do usuário. Elas são úteis para proteger áreas restritas da aplicação.

1. Tipos de Guards

2. Exemplo com Login e Roles

Vamos criar um guard que permite acesso apenas a usuários logados e com determinada role.

// auth.service.ts
import { Injectable } from '@angular/core';

@Injectable({ providedIn: 'root' })
export class AuthService {
  private usuario: any = null;

  login(nome: string, role: string) {
    this.usuario = { nome, role };
  }

  logout() {
    this.usuario = null;
  }

  estaLogado(): boolean {
    return !!this.usuario;
  }

  temRole(role: string): boolean {
    return this.usuario?.role === role;
  }
}

2.1 Criando o Guard

// auth.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { AuthService } from './auth.service';

@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
  constructor(private auth: AuthService, private router: Router) {}

  canActivate(): boolean {
    if (!this.auth.estaLogado()) {
      this.router.navigate(['/login']);
      return false;
    }
    return true;
  }
}

2.2 Guard para Roles

// role.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot } from '@angular/router';
import { AuthService } from './auth.service';

@Injectable({ providedIn: 'root' })
export class RoleGuard implements CanActivate {
  constructor(private auth: AuthService, private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot): boolean {
    const roleNecessaria = route.data['role'];
    if (this.auth.estaLogado() && this.auth.temRole(roleNecessaria)) {
      return true;
    }
    this.router.navigate(['/acesso-negado']);
    return false;
  }
}

3. Configuração das Rotas

// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AdminComponent } from './admin/admin.component';
import { LoginComponent } from './login/login.component';
import { AuthGuard } from './auth.guard';
import { RoleGuard } from './role.guard';

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'login', component: LoginComponent },
  {
    path: 'admin',
    component: AdminComponent,
    canActivate: [AuthGuard, RoleGuard],
    data: { role: 'admin' }
  },
  { path: 'acesso-negado', component: AcessoNegadoComponent }
];

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

4. Como Funciona

- Ao tentar acessar /admin, o Angular executa primeiro o AuthGuard para verificar se o usuário está logado.
- Em seguida, o RoleGuard verifica se o usuário tem a role definida na rota.
- Caso alguma verificação falhe, o usuário é redirecionado para /login ou /acesso-negado.