まぁタイトルの通りなのだが、やり方で悩んだ。
ページ単位でアクセス制限している場合は、ミドルウェアとルートをゴニョゴニョすればいけそうなのだが、
ページ内で部分的に@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なりに切り出すことになると思う。
ビュー側は$isLoggedIn
がtrue
かどうかを@if
で判定する使い方。@auth
になっているところは全部書き換えなければならない。
コメント