Laravel 特定のIPアドレスでアクセスした時、ログインなしでページ内のコンテンツを表示する

まぁタイトルの通りなのだが、やり方で悩んだ。
ページ単位でアクセス制限している場合は、ミドルウェアとルートをゴニョゴニョすればいけそうなのだが、
ページ内で部分的に@authディレクティブなどで内容を分けている場合、どうすればいいんだというお話。

方法1: ダミーユーザーでログイン

ミドルウェアを作成する。

// AllowAccessFromSpecificIP.php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class AllowAccessFromSpecificIP
{
    public function handle($request, Closure $next)
    {
        $allowedIP = '192.168.1.100'; // 許可するIPアドレス

        if ($request->ip() === $allowedIP) {
            // IPアドレスが許可されている場合は、userガードでダミーユーザーをログインさせる
            Auth::guard('user')->loginUsingId(1); // ダミーユーザーIDを指定してログイン
        }

        return $next($request);
    }
}

カーネルに追加する。

// app/Http/Kernel.php

protected $middleware = [
    // 中略
    \App\Http\Middleware\AllowAccessFromSpecificIP::class,
];

結構ゴリ押しなやり方だと思う。
ダミーユーザーを決めてSeederなどで作っておく必要があるので、用途によっては使えないかも。
bladeの@authディレクティブをそのまま使えるのはメリットだと思う。

方法2: コントローラー等で判定

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class HomeController extends Controller
{
    public function index(Request $request)
    {
        // ログイン中の場合またはIPアドレスが一致する場合に true をビューに送信
        $isLoggedIn = Auth::guard('user')->check();
        $ipAddress = $request->ip();
        $allowedIpAddresses = [
            '192.168.1.100', // ここに許可するIPアドレスを追加
            '192.168.1.101',
            // 他の許可するIPアドレスを必要に応じて追加
        ];
        $ipMatched = in_array($ipAddress, $allowedIpAddresses);

        return view('home', ['isLoggedIn' => $isLoggedIn || $ipMatched]);
    }
}

多分こんな感じなのだが、実際にはHelperなりTraitなりに切り出すことになると思う。
ビュー側は$isLoggedIntrueかどうかを@ifで判定する使い方。
@authになっているところは全部書き換えなければならない。

関連記事

コメント

この記事へのコメントはありません。

TOP