Spec-Zone.ru › Angular

Управление доступом к маршрутам с помощью стражей

ВАЖНО: Никогда не полагайтесь на клиентские стражи как на единственное средство контроля доступа. Любой JavaScript, выполняющийся в веб-браузере, может быть изменён пользователем, который работает с браузером. Всегда проверяйте авторизацию пользователя на стороне сервера в дополнение к любым клиентским стражам.

Стражи маршрутов — это функции, которые определяют, может ли пользователь перейти на определённый маршрут или покинуть его. Они похожи на контрольные пункты, которые управляют доступом пользователя к определённым маршрутам. Стражи маршрутов часто используют для аутентификации и контроля доступа.

Создание стража маршрута

Создать страж маршрута можно с помощью Angular CLI:

ng generate guard CUSTOM_NAME

Вам будет предложено выбрать, какой тип стража маршрута использовать, после чего будет создан соответствующий файл CUSTOM_NAME-guard.ts.

СОВЕТ: Страж маршрута также можно создать вручную, добавив отдельный файл TypeScript в проект Angular. Обычно разработчики добавляют в имя файла суффикс -guard.ts, чтобы отличать его от других файлов.

Типы возвращаемых значений стражей маршрутов

Все стражи маршрутов могут возвращать одни и те же значения. Это позволяет гибко управлять навигацией:

Типы возвращаемых значений Описание
boolean true разрешает навигацию, а false блокирует её (см. примечание о страже маршрута CanMatch)
UrlTree или RedirectCommand Выполняет перенаправление на другой маршрут, а не блокирует навигацию
Promise<T> или Observable<T> Маршрутизатор использует первое выданное значение, а затем отменяет подписку

ПРИМЕЧАНИЕ: Страж CanMatch работает иначе: когда он возвращает false, Angular проверяет другие совпадающие маршруты, а не полностью блокирует навигацию.

Типы стражей маршрутов

Angular предоставляет четыре типа стражей маршрутов, каждый из которых предназначен для своей задачи:

CanActivate CanActivateChild CanDeactivate CanMatch

Все стражи имеют доступ к сервисам, предоставляемым на уровне маршрута, а также к сведениям о маршруте через аргумент route.

CanActivate

Страж CanActivate определяет, может ли пользователь получить доступ к маршруту. Чаще всего он используется для аутентификации и авторизации.

Ему доступны следующие аргументы по умолчанию:

  • route: ActivatedRouteSnapshot — содержит сведения об активируемом маршруте
  • state: RouterStateSnapshot — содержит текущее состояние маршрутизатора

Он может возвращать стандартные типы возвращаемых значений стражей.

export const authGuard: CanActivateFn = (
  route: ActivatedRouteSnapshot,
  state: RouterStateSnapshot,
) => {
  const authService = inject(AuthService);
  return authService.isAuthenticated();
};

Совет: чтобы перенаправить пользователя, верните URLTree или RedirectCommand. Не возвращайте false, а затем не выполняйте программный вызов navigate для перенаправления пользователя.

Дополнительные сведения см. в документации API для CanActivateFn.

CanActivateChild

Страж CanActivateChild определяет, может ли пользователь получить доступ к дочерним маршрутам определённого родительского маршрута. Он полезен, когда нужно защитить целый раздел вложенных маршрутов. Иными словами, canActivateChild выполняется для всех дочерних маршрутов. Если у дочернего компонента есть собственный дочерний компонент, canActivateChild выполнится один раз для обоих компонентов.

Ему доступны следующие аргументы по умолчанию:

  • childRoute: ActivatedRouteSnapshot — содержит сведения о «будущем» снимке (то есть состоянии, к которому маршрутизатор пытается перейти) активируемого дочернего маршрута
  • state: RouterStateSnapshot — содержит текущее состояние маршрутизатора

Он может возвращать стандартные типы возвращаемых значений стражей.

export const adminChildGuard: CanActivateChildFn = (
  childRoute: ActivatedRouteSnapshot,
  state: RouterStateSnapshot,
) => {
  const authService = inject(AuthService);
  return authService.hasRole('admin');
};

Дополнительные сведения см. в документации API для CanActivateChildFn.

CanDeactivate

Страж CanDeactivate определяет, может ли пользователь покинуть маршрут. Частый сценарий использования — предотвращение перехода с формы, содержащей несохранённые данные.

Ему доступны следующие аргументы по умолчанию:

  • component: T — экземпляр деактивируемого компонента
  • currentRoute: ActivatedRouteSnapshot — содержит сведения о текущем маршруте
  • currentState: RouterStateSnapshot — содержит текущее состояние маршрутизатора
  • nextState: RouterStateSnapshot — содержит состояние маршрутизатора, к которому выполняется переход

Он может возвращать стандартные типы возвращаемых значений стражей.

export const unsavedChangesGuard: CanDeactivateFn<Form> = (
  component: Form,
  currentRoute: ActivatedRouteSnapshot,
  currentState: RouterStateSnapshot,
  nextState: RouterStateSnapshot,
) => {
  return component.hasUnsavedChanges()
    ? confirm('You have unsaved changes. Are you sure you want to leave?')
    : true;
};

Дополнительные сведения см. в документации API для CanDeactivateFn.

CanMatch

Страж CanMatch определяет, может ли маршрут соответствовать шаблону при сопоставлении путей. В отличие от других стражей, отказ приводит к проверке других совпадающих маршрутов, а не к полной блокировке навигации. Это может быть полезно для флагов функций, A/B-тестирования или условной загрузки маршрутов.

Ему доступны следующие аргументы по умолчанию:

  • route: Route — проверяемая конфигурация маршрута
  • segments: UrlSegment[] — сегменты URL, не использованные при проверке предыдущих родительских маршрутов
  • currentSnapshot: PartialMatchRouteSnapshot — текущий снимок маршрута на данном этапе сопоставления

Он может возвращать стандартные типы возвращаемых значений стражей, но если он возвращает false, Angular проверяет другие совпадающие маршруты, а не полностью блокирует навигацию.

export const featureToggleGuard: CanMatchFn = (
  route: Route,
  segments: UrlSegment[],
  currentSnapshot: PartialMatchRouteSnapshot,
) => {
  const featureService = inject(FeatureService);
  return featureService.isFeatureEnabled('newDashboard');
};

Он также позволяет использовать разные компоненты для одного и того же пути.

// 📄 routes.ts
const routes: Routes = [
  {
    path: 'dashboard',
    component: AdminDashboard,
    canMatch: [adminGuard],
  },
  {
    path: 'dashboard',
    component: UserDashboard,
    canMatch: [userGuard],
  },
];

В этом примере, когда пользователь переходит по адресу /dashboard, будет использован первый маршрут, для которого сработает соответствующий страж.

Дополнительные сведения см. в документации API для CanMatchFn.

Применение стражей к маршрутам

Создав стражи маршрутов, настройте их в определениях маршрутов.

В конфигурации маршрута стражи указываются в виде массивов, что позволяет применять к одному маршруту несколько стражей. Они выполняются в том порядке, в котором указаны в массиве.

import {Routes} from '@angular/router';
import {authGuard} from './guards/auth.guard';
import {adminGuard} from './guards/admin.guard';
import {canDeactivateGuard} from './guards/can-deactivate.guard';
import {featureToggleGuard} from './guards/feature-toggle.guard';

const routes: Routes = [
  // Basic CanActivate - requires authentication
  {
    path: 'dashboard',
    component: Dashboard,
    canActivate: [authGuard],
  },

  // Multiple CanActivate guards - requires authentication AND admin role
  {
    path: 'admin',
    component: Admin,
    canActivate: [authGuard, adminGuard],
  },

  // CanActivate + CanDeactivate - protected route with unsaved changes check
  {
    path: 'profile',
    component: Profile,
    canActivate: [authGuard],
    canDeactivate: [canDeactivateGuard],
  },

  // CanActivateChild - protects all child routes
  {
    path: 'users', // /user - NOT protected
    canActivateChild: [authGuard],
    children: [
      // /users/list - PROTECTED
      {path: 'list', component: UserList},
      // /users/detail/:id - PROTECTED
      {path: 'detail/:id', component: UserDetail},
    ],
  },

  // CanMatch - conditionally matches route based on feature flag
  {
    path: 'beta-feature',
    component: BetaFeature,
    canMatch: [featureToggleGuard],
  },

  // Fallback route if beta feature is disabled
  {
    path: 'beta-feature',
    component: ComingSoon,
  },
];

Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/routing/route-guards

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API