Goal
anguar-material-templateを参考に、Angular13に対応したシンプルなテンプレートを用意する。(上記TemplateはAngular8に対応。)
今回は、認証機能を追加する。
特に、AuthGuardを初めて使ったのが今回のポイント。
Repository
手順
Sharedディレクトリにサービスディレクトリを作成する。
サービスディレクトに、認証サービスを追加する。このサービスでは、Chromeから以外のアクセスを拒否する処理を実装する。
Angular-CanActivateを使って、認証が成功したときのみHome-Dashboardを表示するようにルーティングを設定する。
やってみた
サービスディレクトリとサービスの作成
ng g s shared/services/auth
上記コマンドを実行してサービスクラスを作成する。このサービスは、ブラウザの種類を判定して、検出されたブラウザの列挙体を返す。 サービスを作成したら、Moduleに定義する。今回は、SharedModuleに作成したので、SharedModuleのProvider配列に追加する。
@NgModule({ declarations: [ LayoutComponent, UnauthorizedLayoutComponent ], providers:[ AuthService, //ここ AuthGuard ], imports: [ RouterModule, CommonModule, MaterialModule, FormsModule, ] }) export class SharedModule { }
CanActiveインターフェースを実装する
AuthGuardを利用するため、CanActiveインターフェースを実装する。今回は、Chrome以外のブラウザが検出された場合認証が失敗したことにする. 初めに、ngコマンドでクラスを作成し・・・
ng g s shared/services/router/auth-guard
CanActiveインターフェースを継承・実装する。Chrome以外のブラウザでアクセスした場合は、Unauthorizedコンポーネントにナビゲートされる処理を設定する。Chromeの場合はTrueを返して処理を終了する。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { var browserName = this.authService.detectBrowserName(); if (browserName === BrowserEnum.Chrome) { return of(true); } else { this.router.navigate(["unauthorized"]); return of(false); } }
この時、先ほど作成したAuthServiceをDependInjectionするのを忘れずに行う。
Routerの設定を変更する
Home画面に遷移する際にAuthGuardクラスのCanActivateが呼び出されるように設定を追加する。今回は、Homeコンポートの配下すべてのアクセスを一括で管理したいため、app-routing.module.tsの設定を変更する。同時に、Unauthorizedコンポートへのルーティングも設定する。
const routes: Routes = [ { path: "unauthorized", component: UnauthorizedLayoutComponent, children:[ { path: '', component: UnauthorizedComponent } ] }, { path: 'home', canActivate: [AuthGuard], loadChildren: () => import('./home/home.module').then(m => m.HomeModule) }, { path: '**', redirectTo:'home' } ];