【Laravel】非ログイン時のアクセスを制限する方法|ミドルウェアとリダイレクト処理の実装

【Laravel】非ログイン時のアクセスを制限する方法|ミドルウェアとリダイレクト処理の実装 Laravel

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を設定したり、グループ化したりすることで、柔軟に対応が可能です。ログインページへのリダイレクト処理も自動で行われるため、開発効