0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Angular 「Guard(ガード)機能で予期しないユーザ遷移を防ぐ」について

Last updated at Posted at 2022-08-07
※ログイン画面とホーム画面を実装しなくても画面を用意しておきましょう。

 今回は、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ができます。
app-routing.module.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を触る

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機能を定義したホーム画面に遷移しようとした時に
  画面は開かないけど、別画面に遷移するとか処理が実行されないです。

auth.guard.ts
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だと思っています。

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?