お問い合わせ
NestJsで接続元のIP制限をかける
投稿日:2023-09-06
@prompta
(株)ブロックセブンスソフトウェア
NestJs
Ip制限
Guard

# 概要

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';
  }
}