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

フラグなどを条件に加えることは割りと簡単に実現できるのですが、実際のシステムではuserテーブル以外の他テーブルも参照してアカウントが有効かどうか判定しなければいけないケースもあり、そうなると認証機能をカスタマイズor自前で作る必要が出てきます。

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

Auth::attempt()だとuserテーブルへの照合がOKの時点でログイン済みの状態になってしまうので、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() ユーザーIDによるログイン処理

でログインを行っています。

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

ちなみに、Auth::validate()を使わずにパスワードの照合を行う場合は、以下のようにできます。

気になる点

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

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