こちらの方法がとてもよかったので引用させていただきます。
変更点としては アクセスを許可するIP を .env ファイルに記述しています(後から見返したときに見通しをよくするため)
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);
}
}
app/Http/Kernel.php に以下を追加
protected $routeMiddleware = [
'iplimit' => \App\Http\Middleware\IpLimit::class, // この行を追加する
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) ,
],
];
.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=
routes/web.php
ミドルウェアをかませます
Route::get('/register', 'RegisterController@showRegistrationForm')->name('register');
↓
Route::group(['middleware' => 'iplimit'], function () {
Route::get('/register', 'RegisterController@showRegistrationForm')->name('register');
});
以上です。