Laravelでは認証機能が標準で用意されていて便利なのですが、デフォルトの動きとしては、email(または指定したid的なもの)とpasswordをuserテーブルに照合するだけのロジックになっています。

userテーブルで保持しているフラグなどを条件に加えることはデフォルトのロジックに少し手を入れるだけで実現できるのですが、実際のシステムなんかではuserテーブル以外にも様々なテーブルを参照してそのアカウントが有効かどうか判定しなければいけないケースも多く、そうなると認証機能をカスタマイズor自前で作る必要が出てきます。

そして『Laravel 認証 カスタマイズ』や『Laravel 認証 自作』で検索するといくつかサンプルコードが出てくるのですが、userテーブルへの照合はAuth::attempt()を使っているものがほとんど(というか全部?)です。

Auth::attempt()だとuserテーブルへの照合がOKだった時点でセッションに”login_web_…”の文字列が入りログイン済みのステータスになってしまうので、userテーブルへの照合後に他のテーブルを参照して無効アカウントだった場合などはAuth::logout()を呼ぶ必要があり、ログインが完了していないのにログアウトメソッドを呼ぶのは何かイヤだなと思いました。

そこで、Auth::attempt()を使わない方法で認証ロジックを書いてみたので、備忘録として残したいと思います。

最初に

Laravel標準の php artisan make:auth と php artisan migrate を使って認証機能を実装します。

ルーティングの設定

/routes/web.phpに以下の1行を追加します。

コントローラーにauthenticateメソッドの追加

LoginController.phpを以下のように編集します。

Auth::attempt()を使わずに、Auth::validate()で照合結果だけ取得して、その後Auth::loginUsingId()でログイン処理を行っています。

上記のサンプルコードはattemptをvalidateとloginUsingIdにただ分離しただけのイメージですが、実際にはvalidateを通した後で他テーブルなどを参照し、すべてがOKの場合のみloginUsingIdを実行するようなコードになると思います。

気になる点

Auth::validate()がLaravel4のドキュメントには載っているのに、Laravel5.4のドキュメントには載っていないことがちょっと気になります。Laravelの中のソースを見てみたらしっかり実装されていたので気にせず使っていますが、もしかしたら非推奨なんだろうか…。

誰か知っている人がいたら教えてください。