NestJSにおけるガードに関するお勉強記録です。主に以下のページを見て学んだ内容になります。
Guards | NestJS - A progressive Node.js framework
Laravelにもあるやつですね。認証/認可を実現するのに使う機能だと思いますが、そちらのページより詳しく解説されそうなので簡単に手順だけ残しておこうと思います。上記のページだけ見てもイメージが湧きませんでした。
ガード
それでは簡単に必要な事だけ書いていきます。
ガードの作成
NestJSでは以下のコマンドでガードを作成できます。
nest g guard common/guard/auth
common/guardフォルダの下にauth.guard.tsという名前でファイルが作成されます。作られた直後の中身はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 |
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; @Injectable() export class AuthGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { return true; } } |
ガードの割り当て
他の機能と同じようにデコレータでクラスやメソッドに割り当てます。ガードの場合は@UseGuardsを使います。1行目の様に@nest/commonからUseGuardsをインポートし、10行目の様にクラスに割り当てます。メソッドへの割り当ても出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import { Controller, Get, Post, Param, Body, UseFilters, HttpStatus, HttpException, UseGuards } from '@nestjs/common'; import { CreateCatDto } from './dto/create-cat.dto'; import { CatsService } from './cats.service'; import { Cat } from './interfaces/cat.interface'; import { HttpExceptionFilter } from 'src/common/filter/http-exception.filter'; import { SamplePipe } from 'src/common/pipe/sample.pipe'; import { AuthGuard } from 'src/common/guard/auth.guard'; @Controller('cats') @UseGuards(AuthGuard) export class CatsController { constructor(private catsService: CatsService) { } @Post() @UseFilters(new HttpExceptionFilter()) async create(@Body() createCatDto: CreateCatDto) { this.catsService.create(createCatDto); } @Get() async findAll(): Promise<Cat[]> { throw new HttpException("エラーメッセージ", HttpStatus.FORBIDDEN); } @Get(':id') async findOne(@Param('id', SamplePipe) id: number) { return this.catsService.findOne(id); } } |
お試し
試しにreturnの値をfalseにしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; @Injectable() export class AuthGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { return false; } } |
すると、こんな感じにエラーが返ってきます。本来ならこの辺りに認証/認可のロジックを書くのだと思います。
他にロールごとに処理を分けたりする方法も書かれていましたが、多分後で詳しく書かれていそうなので割愛します。一応今回のサンプルコードを置いておきます。