人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravelで指定したIPアドレスからしかアクセスできないように制限をかける

● Laravelで指定したIPアドレスからしかアクセスできないように制限をかける

https://goo.gl/mzAAiv

こちらの方法がとてもよかったので引用させていただきます。
変更点としては アクセスを許可するIP を .env ファイルに記述しています(後から見返したときに見通しをよくするため)

1. ミドルウェア(IpLimit.php)を作成する

app/Http/Middleware/IpLimit.php


<?php

/**
 * IpLimit.php
 *
 * クライアントのリアルIPがホワイトリストに存在するかチェックするためのミドルウェア
 *
 * @version  0.2		[fix] (int)に正しく型キャストするよう修正
 *
 */

namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Log;

class IpLimit {

	/**
	 * Handle an incoming request.
	 * @param  \Illuminate\Http\Request  $request
	 * @param  \Closure  $next
	 * @return mixed
	 */
	public function handle($request, Closure $next) {
		$config = \Config::get('ip_limit');
		if ($config['enable'] !== true) {
			return $next($request);
		}
		if ($config['isProxy'] === true) {
			$request->setTrustedProxies([$request->ip()]);
		}
		if ($this->isAllow($request->ip(), $config['allowIps']) === false) {
			$error_message = 'cannot access from : ' . $request->ip();
			Log::debug($error_message);
			abort(404, $error_message);
		}
		return $next($request);
	}

	private function isAllow(string $remoteIp, array $accepts) {
		foreach ($accepts as $accept) {
			if ($this->isIn($remoteIp, $accept)) {
				return true;
			}
		}
		return false;
	}

	private function isIn(string $remoteIp, string $accept) {
		if (strpos($accept, '/') === false) {
			return ($remoteIp === $accept);
		}
		list($acceptIp, $mask) = explode('/', $accept);
		$acceptLong = ip2long($acceptIp) >> (32 - (int) $mask);
		$remoteLong = ip2long($remoteIp) >> (32 - (int) $mask);
		return ($acceptLong == $remoteLong);
	}

}

2. Kernel に登録する

app/Http/Kernel.php に以下を追加

    protected $routeMiddleware = [
        'iplimit' => \App\Http\Middleware\IpLimit::class,    // この行を追加する

3. 設定ファイルを作成する

config/ip_limit.php

<?php
return [
    'enable'   => env('IP_LIMIT_ENABLE', false),
    'isProxy'  => env('IP_LIMIT_PROXY',  false),
    'allowIps' => [
        env('LOCALHOST_IP', '127.0.0.1'),
	    env('IP_LIMIT_ENABLE_ADDRESS_01', false) ,
	    env('IP_LIMIT_ENABLE_ADDRESS_02', false) ,
	    env('IP_LIMIT_ENABLE_ADDRESS_03', false) ,
	    env('IP_LIMIT_ENABLE_ADDRESS_04', false) ,
	    env('IP_LIMIT_ENABLE_ADDRESS_05', false) ,
    ],
];

4. .env にアクセスを許可する IP を記述する

.env

IP_LIMIT_ENABLE=true		
# IP_LIMIT_PROXY: Laravelがバランサー配下に設置されている場合にtrueにすると、Real IPを取得する
IP_LIMIT_PROXY=false
IP_LIMIT_ENABLE_ADDRESS_01=xxx.xxx.xxx.xxx/24
IP_LIMIT_ENABLE_ADDRESS_02=yyy.yyy.yyy.yyy
IP_LIMIT_ENABLE_ADDRESS_03=
IP_LIMIT_ENABLE_ADDRESS_04=
IP_LIMIT_ENABLE_ADDRESS_05=

5. .ルーターにミドルウェアを追加する

routes/web.php

ミドルウェアをかませます

Route::get('/register', 'RegisterController@showRegistrationForm')->name('register');

 ↓

Route::group(['middleware' => 'iplimit'], function () {
    Route::get('/register', 'RegisterController@showRegistrationForm')->name('register');
});

以上です。

No.1362
05/03 13:12

edit