Альтернативный маршрут к запрещенному охраняемому маршруту? - PullRequest
0 голосов
/ 31 марта 2020

В случае маршрутизатора ниже, возможно ли установить альтернативный маршрут (например, /) для случая, когда AdalGuard запрещает доступ к маршруту /int или к одному из его дочерних маршрутов?

Я знал, что могу сделать это внутри класса охраны, позвонив .navigateByUrl() внутри него или вернув UrlTree. Но в этом случае AdalGuard происходит из пакета 'adal-angular4', поэтому я не могу сделать такую ​​вещь.

Есть ли что-то вроде указателя 'Else' или 'Catch' на другой маршрут, который я могли бы поместить в определение охраняемого маршрута?

Большое спасибо.

app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { ExtMainComponent } from './ext/ext-main/ext-main.component';
import { IntMainComponent } from './int/int-main/int-main.component';
import { EmailSenderComponent } from './int/email-sender/email-sender.component';
import { AdalGuard } from 'adal-angular4';

const routes: Routes = [
    {path: 'ext', component: ExtMainComponent},
    {
        path: 'int', component: IntMainComponent, canActivate: [AdalGuard], children: [
            {path: 'email', component: EmailSenderComponent}
        ]
    },
    {path: '**', redirectTo: '/'}
];

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

1 Ответ

1 голос
/ 31 марта 2020

AdalGuard само по себе просто, если вы посмотрите на исходный код .

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

Насколько я могу сказать, userInfo.authenticated всегда возвращает синхронный логический тип.

import { Injectable } from '@angular/core';
import { Router, UrlTree, ActivatedRouteSnapshot, CanActivate, CanActivateChild, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { AdalService } from './adal.service';

@Injectable()
export class MyAdalGuard implements CanActivate, CanActivateChild {

  constructor(private adalService: AdalService,
    private router: Router
  ) { }

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): boolean | UrlTree {
    if (this.adalService.userInfo.authenticated) {
      return true;
    }

    return this.router.parseUrl('/some-url');
  }

  public canActivateChild(
    childRoute: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): boolean | UrlTree {
    return this.canActivate(childRoute, state);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...