今回は、Guard機能が機能するかを簡易に確かめるのが目的です。
最初に
Aユーザは、会員登録が完了しているため、 ホーム画面へ遷移できる。 Bユーザーは、未会員のため、ホーム画面へ遷移しようとするとログイン画面に強制遷移。上記のようなことを実現するには、Guard(ガード)機能が使えるそうです。
Guard機能を簡易に実装できるまでをメモします。
(実際に、クラウド接続したり、localstorageから判定したり等は記載しません。)
guard追加
コマンドはこれ→ ng g guard guard/auth
1.(*) CanActivate
2.( ) CanActivateChild
3.( ) CanDeactivate
4.( ) CanLoad
今回は、「認証の確認」のため1.を選択します。
(2.3.4.については、用語でググると情報が出てきます。)
上記コード入力後 routingに追加
上記コード後に、guard/auth.guard.tsができます。
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CE200homeComponent } from './ce200home/ce200home.component';
import { LoginComponent } from './login/login.component';
③import { AuthGuard } from './guard/auth.guard';
const routes: Routes = [
①{ path:'', component: CE200homeComponent,canActivate:[AuthGuard]},
②{ path:'login', component: LoginComponent}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
app-routing.module.tsに、①②③がguard機能に対する記述箇所です。
① デフォルト遷移先をホーム画面に設定
② ログイン画面遷移pathを設定
③ AuthGuard読み込み
簡易に、実装が成功しているか確認するために、
ホームをデフォルト遷移先に設定します。
まだ、分からなくてもいいです。
auth.guard.tsを触る
恐らく、デフォルトは下記状態になっていると思います。
export class AuthGuard implements CanActivate {
constructor(private router: Router){}
canActivate(
route: ActivatedRouteSnapshot, //遷移先の情報
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { //遷移元の情報
return false;
}
}
補:falseが遷移キャンセルをするということで、この状態だけだと
app-routing.module.tsでguard機能を定義したホーム画面に遷移しようとした時に
画面は開かないけど、別画面に遷移するとか処理が実行されないです。
↓
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private router: Router){}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
①return this.router.navigate(['login']);
}
}
①のように、app-routing.module.tsで定義したログインpath:loginを
returnに設定します。
備考
ここまで実装できれば、後は、①localstorageでguard機能実行有無を条件分岐させるとか
②ホーム画面に遷移させようとしたら、ダイアログが出てユーザ操作でログイン画面遷移させる
①②のようにすればアプリっぽい挙動がするようになると思うので好きなようにカスタマイズすればGuard機能実装はOKだと思っています。
以上。