LoginSignup
1
0

More than 1 year has passed since last update.

Laravelで特定のホストでリクエストが来た時しか発動しないrouteを作って管理画面の認証画面すらも隠蔽してみる

Posted at

趣味で作っているLaravelのアプリケーションで管理画面だけ通常のサービスを提供しているホストは全く別のIdentity-Aware Proxyで保護されたホストで配信して、一般のユーザから /admin/ を叩かれても応答を返さないことで管理画面の認証画面すらも隠蔽したくなったのでその方法を紹介したいと思います。

早速route middlewareを作る

名前は何でも良いので早速route middlewareを作りましょう。

app/Http/Middleware/CheckRestrictedRouteHost.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;

class CheckRestrictedRouteHost
{
    /**
     * ルートを特定のホストでのみ返すようにするためのMiddleware
     */
    public function handle(Request $request, Closure $next, string $host)
    {
        if ($request->getHost() === $host) {
            return $next($request);
        }
        abort(404);
        return false;
    }
}

middlewareのパラメータとして渡ってきた $host がリクエストのホストと一致しない場合は強制的に404 Not Foundのエラーを返して処理を中断するだけのmiddlewareを作っておきます。

これを後でrouteのmiddlewareに入れてあげて、リクエストを制限する形にします。

app/Http/Kernel.php
<?php

namespace App\Http;

use App\Http\Middleware\CheckRestrictedRouteHost;

class Kernel extends HttpKernel
{
    protected $routeMiddleware = [
        'route.restrict.byhost' => CheckRestrictedRouteHost::class,
    ];
}

ここは他のroute middlewareと同様に、 routeMiddleware に登録してあげます。

準備はこれでおわり!

対象のrouteにmiddlewareを付ける

ここでは例として、 example.com で来たリクエストのみレスポンスを返すrouteを定義してみます。

routes/web.php
<?php

use Illuminate\Support\Facades\Route;

// example.comでしか返さないroute
Route::group(['middleware' => ['route.restrict.byhost:example.com']], function () {
    // 制限したいrouteをここに記述
    Route::resource('admin', '\App\Http\Controllers\Page\AdminController')
        ->only(['index']);
    Route::group(['prefix' => 'admin'], function () {
        // 以下略...
    });
});

middleware として設定してあげるだけですね!

さいごに

ホストが一致すれば通常通りリクエストを返す仕組みなので認証としては使えませんが(流石にこれだけで担保するのはやめましょう)、管理画面の認証画面すらも隠蔽したい時に使える手法なので試してみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0