Guards в Angular - это механизм для контроля доступа к маршрутам. CanActivate
- это интерфейс, который позволяет определить, может ли пользователь перейти по определенному маршруту.
CanActivate
.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.isAuthenticated()) {
return true;
} else {
// Перенаправляем на страницу входа
return this.router.createUrlTree(['/login']);
}
}
}
Регистрация Guard в модуле: Guard должен быть зарегистрирован как провайдер в Angular модуле.
Применение Guard к роуту: В конфигурации маршрутов добавляем guard к нужным роутам.
const routes: Routes = [
{ path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] },
{ path: 'profile', component: ProfileComponent, canActivate: [AuthGuard] },
{ path: 'login', component: LoginComponent }
];
data
в конфигурации роута.{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard],
data: { roles: ['admin'] }
}
И затем использовать эти данные в Guard:
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
const requiredRoles = next.data.roles;
// Проверка ролей пользователя
}
canActivate
может возвращать Observable или Promise для асинхронных операций.canActivate(): Observable<boolean> {
return this.authService.checkAuth().pipe(
map(isAuth => isAuth || this.router.parseUrl('/login'))
);
}
UrlTree
для перенаправлений (новый подход Angular)canActivateChild
для защиты дочерних роутов@Injectable()
export class RoleGuard implements CanActivate {
constructor(private auth: AuthService, private router: Router) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean|UrlTree> {
return this.auth.currentUser$.pipe(
take(1),
map(user => {
const requiredRoles = route.data.roles;
if (!user) {
return this.router.createUrlTree(['/login'], {
queryParams: { returnUrl: state.url }
});
}
if (!requiredRoles || requiredRoles.some(role => user.roles.includes(role))) {
return true;
}
return this.router.createUrlTree(['/access-denied']);
})
);
}
}
Guards - мощный механизм защиты маршрутов в Angular. Они позволяют гибко управлять доступом, интегрироваться с сервисами аутентификации и реализовывать сложные сценарии проверки прав доступа. Правильное использование guards значительно повышает безопасность Angular-приложений.