Angular Guards: запретить доступ к URL-адресу вручную

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

Вместо этого мы хотим сделать их доступными только тогда, когда мы программно перемещаемся с помощью router.navigate() по логике нашего приложения.

Используя защиту Angular CanActivate, есть ли какой-то флаг или атрибут, который мы могли бы использовать, чтобы различать эти два случая:

  1. Доступ к маршруту осуществляется напрямую, поскольку пользователь ввел /no/direct/access в адресную строку.

  2. Доступ к маршруту осуществляется через router.navigate(['/', 'no', 'direct', 'access']) (который, в свою очередь, может быть вызван другим сторожем, поэтому router.navigated, к сожалению, здесь не помогает)


person qqilihq    schedule 08.11.2019    source источник


Ответы (1)


Я не нашел возможности различить описанные вами случаи. Я нашел способ предотвратить ручную навигацию по маршруту

Вы можете проверить свойство .navigated на маршрутизаторе. Согласно документам это

Истина, если произошло хотя бы одно событие навигации, в противном случае — ложь.

export class PreventDirectNavigationGuard implements CanActivate {
  constructor(
    private _router: Router,
  ) { }
  canActivate(
    _activatedRouteSnapshot: ActivatedRouteSnapshot,
    _routerStateSnapshot: RouterStateSnapshot,
  ): boolean | UrlTree {

    return this._router.navigated;
  }
}

Также Angular имеет флаг триггера навигации. Из исходного кода

Identifies how this navigation was triggered.

imperative - Triggered by `router.navigateByUrl` or `router.navigate`.
popstate -  Triggered by a popstate event.
hashchange - Triggered by a hashchange event.
       trigger: 'imperative' | 'popstate' | 'hashchange';
person Steve    schedule 08.11.2019
comment
Если вы манипулируете URL-адресом, ваше приложение будет перезагружено и будет считаться первой навигацией для angular. - person Steve; 08.11.2019
comment
Спасибо за это. К сожалению, router.navigated становится false при перенаправлении с другого охранника (см. пункт 2 в моем вопросе), так как раньше не было «навигации» :-( Поймите, что это крайний случай, и мне, вероятно, придется полностью обдумать это . - person qqilihq; 08.11.2019