Laravelで同時ログイン禁止を実現する

Laravelで同時ログイン禁止(後勝ち)処理を追加するために調査した結果、
私の中でのベストプラクティスを書き留めておきます。

同時ログイン禁止(後勝ち)とは

ここでは、同時ログイン禁止(後勝ち)の処理を以下のように定義します。

あるユーザーが、端末Aでログインしているとき、同じアカウントを使用して、別の端末Bでログインを試行すると、
端末Bでのログインが許可され、端末Aでログインしているユーザーは強制ログアウトされる処理のこと。

実現のための方針

実装方法はいくつかあるかと思いますが、なるべくフレームワークのソースに手を加えることなく、
メンテナンスが容易になるようなシンプルな調整に留めることを目標としました。

※ そのため、今回ご紹介する方法は、 Laravel 5.6 以上 を使用する必要があります。

実装手順

AuthenticateSession ミドルウェアを有効にする

Laravel 5.6 より、現在のユーザーの現在のデバイス上のセッションを切らずに、
他のデバイス上のセッションを無効化し「ログアウト」させることができるようになりました。

今回は、これを使用するため、app/Http/Kernel.phpクラスのwebミドルウェアグループ中に、
Illuminate\Session\Middleware\AuthenticateSessionミドルウェアが存在し、コメントを外すことを忘れずに行います。

'web' => [
    // ...
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    // ...
],

ログイン直後に他のデバイス上のセッションを無効化する

ログイン直後の処理として、AuthファサードのlogoutOtherDevicesメソッドが実行されるようにしてください。
このメソッドは、入力フォームからアプリケーションが受け取る、現在のパスワードを引数に渡す必要があります。

<?php

use Illuminate\Http\Request;

protected function authenticated(Request $request, $user)
{
    auth()->logoutOtherDevices($request->input('password'));
}

以上により、後勝ちの同時ログイン禁止処理が実現できたかと思います。