趣味で作っているLaravelのアプリケーションで管理画面だけ通常のサービスを提供しているホストは全く別のIdentity-Aware Proxyで保護されたホストで配信して、一般のユーザから /admin/
を叩かれても応答を返さないことで管理画面の認証画面すらも隠蔽したくなったのでその方法を紹介したいと思います。
早速route middlewareを作る
名前は何でも良いので早速route middlewareを作りましょう。
<?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に入れてあげて、リクエストを制限する形にします。
<?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を定義してみます。
<?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
として設定してあげるだけですね!
さいごに
ホストが一致すれば通常通りリクエストを返す仕組みなので認証としては使えませんが(流石にこれだけで担保するのはやめましょう)、管理画面の認証画面すらも隠蔽したい時に使える手法なので試してみてください。