3

不正なアクセスを防ぐために、ルートに警備員がいます。ガードはセッションをチェックし、有効でない場合はログオン サービスを呼び出します。次のようにルートを構成しています...

const routes: Routes = [
    { path: 'logon', loadChildren: './logon/logon.module#LogonModule' },
    { path: '', redirectTo: 'home', pathMatch: 'full' },
    { path: 'home', loadChildren: './home/home.module#HomeModule', canActivate: [HomeGuard] },
    { path: 'forms', loadChildren: './forms/forms.module#FormsModule', canActivate: [FormsGuard] },
    { path: 'processes', component: ProcessesComponent, canActivate: [ProcessGuard] },
    { path: '**', redirectTo: 'home' }
];

Guard からのコード スニペット...

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

      // This always reports home !
      alert('Logon Guard - State = ' + state.url);

      if (this.logonService.IsLoggedOn()) {
        return true;
      } 
      else {
        // Tell the clientApp what url was in use when calling the canActivate.
        this.logonService.RedirectUrl = state.url;

        this.router.navigate(['logon']);
        return false;
      }
  }

ログオン後に最初に要求されたルートに再ルーティングしたかったので、RouterStateSnapshot url を使用して要求されたルートを取得しようとしました。ただし、デフォルトで指定されたルートは常に保持されます。

{ パス: '', redirectTo: 'ホーム', pathMatch: 'フル' },

したがって、「プロセス」ルート、つまり「http://localhost:4200/process」を参照すると、ガードの canActivate は常に RouterStateSnapshot url プロパティの「ホーム」ルートを保持します。

次の同様のリクエストを見てきました... Angular 2 RouterStateSnapshotが正しいURLを返さない

ルートごとに異なるガードを指定するという提案を試みましたが (必死になって)、これは機能しません。とにかくこれは確かに答えではありませんか?ルート間で認証ガードを共有できるようにする必要がありますか?

私はAngular 4を使用しています。

4

0 に答える 0