0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめての記事投稿
Qiita Engineer Festa20242024年7月17日まで開催中!

Laravelのログイン機能の認証処理のカスタマイズ(emailカラムとpasswordカラム以外で認証する)

Posted at

イントロ

Laravelのログイン機能を実装するぞ!!!!!
  • メールアドレス
  • パスワード

上記の項目で認証を行うのが定番だけど、これらを変えたいからカスタマイズする!

  • ユーザーコード
  • パスワード(passwordカラムじゃないパスワードを管理しているカラムから参照したい!)

フォームから入力されたこれらの値でな!

というのがこの記事のざっくりとした内容です。

働いている現場によっては下記のようなことを言われることがあります。

  • メールアドレスじゃないのをログイン時には使いたいからメールアドレス以外でログインできるようにしたい

  • ユーザーテーブルのパスワードはpasswordって名前のカラムで管理してなくて、hoge_passwordってカラムで管理する

…ということがあるので備忘録として残します。
私自身が仕事でやるのに方法が見つからなくてすごい焦った

「そんなこと簡単にできるのか?」と思いましたが、やってみたら結構簡単でした!

バージョン

Laravel Framework 11.7.0

認証の流れの基本

ここではカスタマイズの前にLaravelの認証処理の基本的な動きを紹介しています。

「そんなのわかってるわ!」って人は飛ばして大丈夫です。

Authファザードのattemptメソッドを使って認証を行うのが基本ですね。
attemptメソッドは引数としてキー/値のペアで配列を受け取ります。

LoginController.php
if(Auth::attempt([
    'email' => 'hogehoge@example.com',
    'password' => 'hogehogeYeah'    // ハッシュ化しなくても大丈夫
])) {
    // 認証成功後の処理を記載する
}

usersテーブルのemailカラムの値(メールアドレス)を持っているユーザーがいるか確認し、そのメールアドレスを持つユーザーのpasswordカラムの値(パスワード)が合っているのか確認する。
…というのが認証の流れですが、そこを変更したいので変更します。

認証時の条件で`email`カラムの値から確認するのを変更する

メールアドレスを変更したい場合ははっきり言って超がつくほど楽勝です。

単純に、キー名を変えたらいいだけです。

LoginController.php
if(Auth::attempt([
    'user_code' => '9ka11djhUs_20',
    'password' => 'hogehogeYeah'    // ハッシュ化しなくても大丈夫
])) {
    // 認証成功後の処理を記載する
}

この例ではattemptメソッドがusersテーブルのuser_codeカラムで『9ka11djhUs_20』の値を持っているレコードを見に行って、そのpasswordカラムのパスワードが合っているかを確認してくれます。

認証時の条件でpasswordカラムの値から確認するのを変更する

パスワードはちょっと手間がかかる部分です。

attemptメソッドを呼び出す時は実はSessionGuardattemptメソッドを呼び出しています。
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Auth/SessionGuard.php#L377

その後に、パスワード認証等はEloquentUserProviderで行っているのですが、パスワードのキーはpasswordで固定になっているそうです。
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Auth/EloquentUserProvider.php#L151

usersテーブルのパスワードを管理しているカラムがpasswordという名前ではない場合は、Authenticatableを継承しているUserモデルクラスでオーバーライドして別のカラム名を設定する必要があります。

LoginController.php
if(Auth::attempt([
    'user_code' => '9ka11djhUs_20',
    'password' => 'hogehogeYeah'    // ハッシュ化しなくても大丈夫
])) {
    // 認証成功後の処理を記載する
}

このにすることでパスワードはhash_passカラムの値を見てくれるようになります。

User.php
class User extends Authenticatable
{
    /**
    *
    * 認証時にUserテーブルのpasswordカラムではなく
    * hash_passカラムを使うためオーバーライドする
    * @return string
    */
    public function getAuthPassword(): string
    {
        return $this->hash_pass;
    }
}

この例ではattemptメソッドがusersテーブルのuser_codeカラムで『9ka11djhUs_20』の値を持っているレコードを見に行って、オーバーライドしたことによりそのレコードのhash_passカラムで管理しているパスワードが合っているかを確認してくれます。

注意点

公式ドキュメントより

フレームワークは、データベース内のハッシュ化されたパスワードと比較する前に、値を自動的にハッシュするため

認証時でパスワードはハッシュ化した値を確認してくれるので、もしオーバーライドしてpassword以外のカラムにした場合もそのカラムではハッシュ化した値を管理するようにしてください。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?