イントロ
Laravelのログイン機能を実装するぞ!!!!!- メールアドレス
- パスワード
上記の項目で認証を行うのが定番だけど、これらを変えたいからカスタマイズする!
- ユーザーコード
- パスワード(
password
カラムじゃないパスワードを管理しているカラムから参照したい!)
フォームから入力されたこれらの値でな!
というのがこの記事のざっくりとした内容です。
働いている現場によっては下記のようなことを言われることがあります。
-
メールアドレスじゃないのをログイン時には使いたいからメールアドレス以外でログインできるようにしたい
-
ユーザーテーブルのパスワードは
password
って名前のカラムで管理してなくて、hoge_password
ってカラムで管理する
…ということがあるので備忘録として残します。
私自身が仕事でやるのに方法が見つからなくてすごい焦った
「そんなこと簡単にできるのか?」と思いましたが、やってみたら結構簡単でした!
バージョン
Laravel Framework 11.7.0
認証の流れの基本
ここではカスタマイズの前にLaravelの認証処理の基本的な動きを紹介しています。「そんなのわかってるわ!」って人は飛ばして大丈夫です。
Authファザードのattempt
メソッドを使って認証を行うのが基本ですね。
attempt
メソッドは引数としてキー/値のペアで配列を受け取ります。
if(Auth::attempt([
'email' => 'hogehoge@example.com',
'password' => 'hogehogeYeah' // ハッシュ化しなくても大丈夫
])) {
// 認証成功後の処理を記載する
}
users
テーブルのemailカラムの値(メールアドレス)を持っているユーザーがいるか確認し、そのメールアドレスを持つユーザーのpassword
カラムの値(パスワード)が合っているのか確認する。
…というのが認証の流れですが、そこを変更したいので変更します。
認証時の条件で`email`カラムの値から確認するのを変更する
メールアドレスを変更したい場合ははっきり言って超がつくほど楽勝です。単純に、キー名を変えたらいいだけです。
if(Auth::attempt([
'user_code' => '9ka11djhUs_20',
'password' => 'hogehogeYeah' // ハッシュ化しなくても大丈夫
])) {
// 認証成功後の処理を記載する
}
この例ではattempt
メソッドがusers
テーブルのuser_code
カラムで『9ka11djhUs_20』の値を持っているレコードを見に行って、そのpassword
カラムのパスワードが合っているかを確認してくれます。
認証時の条件でpasswordカラムの値から確認するのを変更する
パスワードはちょっと手間がかかる部分です。attemptメソッドを呼び出す時は実はSessionGuard
のattempt
メソッドを呼び出しています。
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
モデルクラスでオーバーライドして別のカラム名を設定する必要があります。
if(Auth::attempt([
'user_code' => '9ka11djhUs_20',
'password' => 'hogehogeYeah' // ハッシュ化しなくても大丈夫
])) {
// 認証成功後の処理を記載する
}
このにすることでパスワードはhash_pass
カラムの値を見てくれるようになります。
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
以外のカラムにした場合もそのカラムではハッシュ化した値を管理するようにしてください。