# 概要
NestJsにはguard decoratorが用意されていて簡単に接続制限を実装する事が可能です。
今回はよくあるIP制限の実装を行なってみました。
# ipアドレスの取得
Guard用クラスを実装する前に接続元のipアドレスを取得するモジュールを追加します。
npm i @supercharge/request-ip
.env
にアクセス元のIPを書き込みます。
ALLOW_IPS=192.168.0.1 192.168.0.1
複数ある場合はスペース区切りでipアドレスを追記します。
# Guardの実装
./src/domain/admin-auth/guard/ip-guard.ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
import { ConfigService } from '@nestjs/config';
import * as IP from '@supercharge/request-ip';
@Injectable()
export class IpGuard implements CanActivate {
constructor(private config: ConfigService) {}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
const clientIp = IP.getClientIp(request);
const allowIps = this.config.get<string>('ALLOW_IPS').split(' ');
return allowIps.includes(clientIp);
}
}
IP.getClientIp(request)
にてリクエスト情報からipアドレスを取得しています。- 接続元のIPがホワイトリストに載っている場合はアクセス可能です。
# コントローラーから呼び出し
import {
Controller,
UseGuards,
} from '@nestjs/common';
import { IpGuard } from './domain/admin-auth/guard/ip-guard';
@Controller()
@UseGuards(IpGuard)
export class AppController {
.
.
.
}
@UseGuards(IpGuard)
にて使用するGuardを指定します。これでコントローラ全体にGuardがかかります
(複数ある場合は @UseGuards(IpGuard, AuthGuard)
のような形で指定できます)
各リクエストごとにかけるGuardを変更したい場合はclass宣言のデコレーターではなく
function側にデコレータを指定します。
export class AppController {
@UseGuards(IpGuard)
@Get('')
hello() {
return 'ok';
}
}