Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@fakefurcoronet

LaravelでIPによるアクセス制限をする

はじめに

管理画面であったり開発環境であったり、アクセス拠点元のIPで制限を行いたい場面に出くわすことがあるかと思います。
.htaccessファイルで制限したり、AWSのALB(Application Load Balancer)で大本から制限する事もできますが、
手軽に実装しつつも画面によってIP制限を切り分けたい~だとか、許可されないIPの場合でも任意のメッセージを表示してあげたい~…
といった場合は、ミドルウェアで実装してrouteに対して割り当ててやるのが一番簡単かなと思います。

Laravelのバージョンは5.7にて確認しています。

Middleware

本番環境とステージング環境の場合だけ、特定のIPアドレスでアクセスを制限してみます。

下記では予め許可されたIPの一覧を配列に用意しておき、アクセス元のIPが配列に含まれているかどうかで制限しています。
どのIPがどの拠点か分かるようにIPアドレスと共に拠点の名前などを残しておくと管理する上で便利でしょう。

今回は許可されていないIPアドレスの場合は403エラーへ飛ばしています。

app\Http\Middleware\CheckIPAddress.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class CheckIPAddress
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (App::environment(['staging', 'production'])) {
            $ip = [
                ['id' => 1, 'ip' => '192.168.0.1', 'name' => 'office-1'],
                ['id' => 2, 'ip' => '192.168.0.2', 'name' => 'office-2'],
                ['id' => 3, 'ip' => '192.168.0.3', 'name' => '自宅'],
            ];

            // check your ip
            $detect = collect($ip)->contains('ip', $request->ip());

            if (!$detect) {
                abort(403);
            }
        }

        return $next($request);
    }
}

次に、上記のミドルウェアを登録します。

routeに対してミドルウェアを割り当てる場合はルートミドルウェアに登録し…

app\Http\Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'checkIP' => \App\Http\Middleware\CheckIPAddress::class,
    ];

routeでミドルウェアを割り当ててやります。

routes\web.php
Route::group(['middleware' => 'checkIP'], function () {
    Route::get('mypage/{slug}', ['uses' => 'MypageController@index'])->name('mypage.show');
});

そもそもアプリケーションの全HTTPリクエスト対して制限したいんだ、という場合はグローバルミドルウェアに登録すればOKです。

app\Http\Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \App\Http\Middleware\CheckIPAddress::class,
    ];

おわりに

調べれば同じような情報はいくらでも出てくるんですが、自分用の備忘録として…

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
fakefurcoronet
あの時ソースを残しておけば良かった! そんな後悔を繰り返さないためのQiita

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?