【Laravel / Auth】 email以外でログインしたい

えびさん

Laravelではemailログインがデフォルトだけど、
ログインIDなど他のカラムでログインしたい場合もある

そもそもの仕様

Laravelでログインする対象カラム (デフォルトはemail)は、
AuthenticatesUsers::usernameで一元管理されている

Auth\LoginControllerではAuthenticatesUsersトレイトを利用しているので、
オーバーライド(=設定の上書き)が可能

ログインする対象のカラムをlogin_idに変更する

  • Auth\LoginController.phpにusernameメソッドを記載
<?php
// (省略)

public function username()
{
    // ⭐️ emailの代わりに使用したいカラム名を指定する
    return 'login_id';
 }

これでオーバーライドされてlogin_idカラムがチェック対象になる

emailでもlogin_idでもログインさせたい場合

AuthenticatesUsers::attemptLoginをオーバーライドする

  • Auth\LoginController.phpattemptLoginメソッドを追記
<?php
// (省略)

protected function attemptLogin(Request $request)
{
    $username = $request->input($this->username());
    $password = $request->input('password');
 
    if (filter_var($username, \FILTER_VALIDATE_EMAIL)) {
        $credentials = ['email' => $username, 'password' => $password];
    } else {
        $credentials = [$this->username() => $username, 'password' => $password];
    }
 
    return $this->guard()->attempt($credentials, $request->filled('remember'));
}

LoginControllerでuse Illuminate\Http\Request;を記載していない場合はこれも追記

解説

if (filter_var($username, \FILTER_VALIDATE_EMAIL)) で、入力された値( = $username)がメールアドレス形式かどうかを判定している

結果がtrueの場合はemailカラムを、
falseの場合はusernameメソッドで上書きしたカラムを見に行くように条件分岐してる