Webアプリケーションでは、ログインしていないユーザーに対して特定ページへのアクセスを制限したい場面が多くあります。Laravelではミドルウェアを活用することで、認証状態に応じたルーティング制御が簡単に実装できます。この記事では、非ログイン状態のアクセスを制限し、ログインページへリダイレクトする方法を解説します。
認証ミドルウェアとは?
Laravelの認証ミドルウェア(auth
)は、ユーザーがログインしていない場合に、指定したルートへのアクセスを拒否し、自動的にログインページへリダイレクトする仕組みです。
ログイン状態を確認する必要があるページや機能には、このauth
ミドルウェアを適用します。
ルートにミドルウェアを適用する方法
ルート定義の中でmiddleware
メソッドを使って簡単に適用できます。
use Illuminate\Support\Facades\Route;
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
この例では、ログインしていないユーザーが/dashboard
にアクセスすると、自動的に/login
へリダイレクトされます。
複数のルートにまとめて適用する
ルートをグループ化して、複数のルートに一括でauth
ミドルウェアを適用することも可能です。
Route::middleware(['auth'])->group(function () {
Route::get('/mypage', [UserController::class, 'index']);
Route::get('/settings', [UserController::class, 'settings']);
});
この方法を使えば、ログインが必要な画面をまとめて保護できます。
認証が必要なページにアクセスしたときの挙動
認証されていないユーザーがauth
ミドルウェア付きのルートにアクセスした場合、Laravelは自動的に/login
にリダイレクトします。
このリダイレクト先をカスタマイズしたい場合は、app/Http/Middleware/Authenticate.php
を編集します。
protected function redirectTo($request)
{
if (!$request->expectsJson()) {
return route('login');
}
}
route('login')
の部分を、任意のページに変更することでリダイレクト先を自由に調整できます。
認証状態の確認をBladeテンプレートでも使う
Bladeテンプレート内で、ログイン状態を使って表示・非表示を切り替えることもできます。
@auth
<p>ようこそ、{{ Auth::user()->name }}さん</p>
@endauth
@guest
<p>ログインしてください。</p>
@endguest
@auth
はログイン済みユーザー向け、@guest
は未ログインユーザー向けの表示に使います。
APIでの認証制御(Sanctum・Passport)
APIにおいても、ミドルウェアでアクセス制限が可能です。たとえば、Sanctumを導入している場合は、以下のようにauth:sanctum
を指定します。
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
認証トークンがない場合は、401エラーを返します。
まとめ
Laravelでは、ミドルウェアを使うことでログイン状態に応じたアクセス制御が簡単に実装できます。ルートごとにauth
を設定したり、グループ化したりすることで、柔軟に対応が可能です。ログインページへのリダイレクト処理も自動で行われるため、開発効