LaravelのMiddlewareを使って特定のIP以外からアクセスできないようにする



Laravelで、特定のIP以外からアクセスをできないようにする方法の紹介です。

業務で使う管理システムや特定のAPIなど、セキュリティー性を重視したい時は、決められたIP(場所)からしかアクセスを許可したくない時もあります。

Httpサーバー側でipベースのアクセス制御をする場合は、 Apacheであれば '.htaccess 'に、nginxであれば configファイル内に 'allow', 'deny'などを記述しますが、許可するIPが増えると設定ファイルを書き換え、サーバーをリスタートする必要があります。

そのようなことをLaravelフレームワーク側で制御する方法の紹介です。
 

今回すること 

- Middlewareを使って、特定のIP ( 例えば会社や支店から ) 以外からアクセス出来ないようにする

artisanコマンドを使ってmiddlewareの作成

 まず最初に、コマンドライン、プロジェクトルート上から ' artisan 'コマンドを使って、元になるMiddlewareの作成をします。
下のスニペットでは ' IpMiddleware ' というファイルを作成しました。

# app/Http/Middlewareに 'IpMiddleware.php' が作成されます
php artisan make:middleware IpMiddleware


middlewareの記述

Middlewareを作成したら、特定のIPを以外のアクセスを拒否する処理を書いていきます。

Laravelに用意されている ' Illuminate\Http\Request ' クラスには クライアントのipを取得する ' ip ' メソッドが用意されているので、それを使って、登録(許可された)した ip かどうか collectionの ' contains ' メソッドを使って比較します。

// app/Http/Middleware/IpMiddleware.php
namespace App\Http\Middleware;

use Closure;

class IpMiddleware
{
    public function handle($request, Closure $next)
    {
        // IPの配列 * 実際に使う時はDBからデータを取得すると思います
        $ip = [
            ['id' => 1, 'name' => '東京本社', 'ip' => '127.0.0.1'],
            ['id' => 2, 'name' => '大阪支社', 'ip' => '127.0.0.2'],
            ['id' => 3, 'name' => '名古屋支社', 'ip' => '127.0.0.3'],
            ['id' => 4, 'name' => '福岡支社', 'ip' => '127.0.0.4'],
            ['id' => 5, 'name' => '北海道支社', 'ip' => '127.0.0.5']
          ];
        /* 上の変数$ipにアクセスされたIPが含まれているかチェック */
        // $request->ip() で クライアント ipが取得できます
        $detect = collect($ip)->contains('ip', $request->ip());

        // ipが含まれていない時の処理
        if (!$detect) {
            // ここでは route()->name('invalid')にリダイレクト
            return redirect('invalid');
        }
        // ipが含まれていればリクエストが通る
        return $next($request);
    }
}


上で作成した Middlewareを ' Kernel.php 'へ登録すれば完了です。

// app/Http/Kernel.php
protected $routeMiddleware = [
    // ...
      
      // 上記で作成した IpMiddleware を 'ip.companies' として登録登録
      'ip.companies' => \App\Http\Middleware\IpMiddleware::class,
 ];


Kernel.phpへ作成したMiddlewareへの登録が完了すれば、routesファイル上から ' middleware 'メソッドを通して使うことができます。

// routes/web.php

Route::get('/company_secret', function () {
    // do something
})->middleware('auth','ip.companies');


Summary

専用のMiddlewareを作成することで、ルートによってipアクセスを分けることが簡単にできるようになります。
( Laravel 5.1 ~ 可能です )

Role(役割)単位で機能を制限することはよくありますが、本社からのみ使える機能など、建物(ip)単位で機能制限を設けたいときに参考になると思います。

Laravel : Middleware

 

この記事のカテゴリ
プログラミング

この記事に付けられているタグ