【Laravel】認証機能を自作する方法|Authを使わずログイン処理を手動で実装する

【Laravel】認証機能を自作する方法|Authを使わずログイン処理を手動で実装する Laravel

LaravelではBreezeやSanctumなどのパッケージを使って認証機能を手軽に実装できますが、仕組みを深く理解したい場合やカスタム要件がある場合には、Authを使わずに自作することが有効です。この記事では、Laravelでログイン・ログアウト処理を手動で構築する方法をステップごとに解説します。

前提:usersテーブルの準備

以下のようなusersテーブルが存在していることを前提とします。

  • email(ログインID)
  • password(ハッシュ化されたパスワード)

マイグレーション例:

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('email')->unique();
    $table->string('password');
    $table->timestamps();
});

ログインフォームの作成

以下のようなシンプルなログインフォームを用意します。

<form method="POST" action="{{ route('login.process') }}">
    @csrf
    <input type="email" name="email" placeholder="メールアドレス">
    <input type="password" name="password" placeholder="パスワード">
    <button type="submit">ログイン</button>
</form>

ルート定義

web.phpでログイン処理のルートを定義します。

use App\Http\Controllers\AuthController;

Route::get('/login', [AuthController::class, 'showLoginForm'])->name('login');
Route::post('/login', [AuthController::class, 'login'])->name('login.process');
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');

ログイン処理の実装

AuthControllerを作成し、ログイン処理を記述します。

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Models\User;

class AuthController extends Controller
{
    public function showLoginForm()
    {
        return view('auth.login');
    }

    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        $user = User::where('email', $credentials['email'])->first();

        if (!$user || !Hash::check($credentials['password'], $user->password)) {
            return back()->withErrors([
                'login' => 'メールアドレスまたはパスワードが正しくありません。',
            ]);
        }

        session(['login_user' => $user->id]);

        return redirect()->intended('/dashboard');
    }

    public function logout(Request $request)
    {
        $request->session()->forget('login_user');
        return redirect('/login');
    }
}

ログイン状態のチェック

コントローラやBladeでログイン状態を確認したい場合は、セッションをチェックします。

if (session()->has('login_user')) {
    // ログイン中
}

ログインユーザーの情報を取得したい場合:

$user = \App\Models\User::find(session('login_user'));

ログイン必須ページへのアクセス制御

ログインしていない場合にログインページへリダイレクトするミドルウェアを作成します。

php artisan make:middleware CheckLogin

中身を以下のように編集します。

public function handle($request, Closure $next)
{
    if (!session()->has('login_user')) {
        return redirect()->route('login');
    }

    return $next($request);
}

このミドルウェアをkernel.phpに登録し、必要なルートへ適用します。

'check.login' => \App\Http\Middleware\CheckLogin::class,
Route::middleware(['check.login'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
});

まとめ

LaravelのAuth機能を使わずにログイン処理を自作することで、認証の仕組みを深く理解し、柔軟なカスタマイズが可能になります。セッションを用いたユーザー管理、パスワードのハッシュチェック、ログイン状態の確認など、基本的な流れを押さえることが重要です。

本格的なアプリケーションに発展させるには、CSRF保護やパスワード再設定機能、多要素認証などの追加実装も検討するとよいでしょう。