Laravelで、特定のIP以外からアクセスをできないようにする方法の紹介です。
業務で使う管理システムや特定のAPIなど、セキュリティー性を重視したい時は、決められたIP(場所)からしかアクセスを許可したくない時もあります。
Httpサーバー側でipベースのアクセス制御をする場合は、 Apacheであれば '.htaccess 'に、nginxであれば configファイル内に 'allow', 'deny'などを記述しますが、許可するIPが増えると設定ファイルを書き換え、サーバーをリスタートする必要があります。
そのようなことをLaravelフレームワーク側で制御する方法の紹介です。
- Middlewareを使って、特定のIP ( 例えば会社や支店から ) 以外からアクセス出来ないようにする
まず最初に、コマンドライン、プロジェクトルート上から ' artisan
'コマンドを使って、元になるMiddlewareの作成をします。
下のスニペットでは ' IpMiddleware
' というファイルを作成しました。
# app/Http/Middlewareに 'IpMiddleware.php' が作成されます
php artisan make:middleware IpMiddleware
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');
専用のMiddlewareを作成することで、ルートによってipアクセスを分けることが簡単にできるようになります。
( Laravel 5.1 ~ 可能です )
Role(役割)単位で機能を制限することはよくありますが、本社からのみ使える機能など、建物(ip)単位で機能制限を設けたいときに参考になると思います。
Laravel : Middleware