前書き
以下の環境で実行した内容となります。
- PHP 8.2
- Laravel 10.31.0
背景
Laravel10を使って開発中、認証機能を使いたいものの既存テーブルにあるユーザー情報を活用したいと思いました。
そのまま利用してもLaravelのusersテーブルを探しに行ってしまうので、既存テーブルに指定すればよいと楽観視していました。
ここでは例として以下のような構造とします。
テーブル名:login
userID | pass |
---|---|
user1 | \$2y\$.. |
変更点
- Models\User のクラスにテーブルを指定
- テーブル構造が異なるのでその他設定を追加
class User extends Authenticatable
{
...
//既存のログインテーブルを使う
protected $table = 'login';
protected $primaryKey = 'userID';
//remember_tokenはないためfalse
protected $rememberTokenName = false;
//主キーは文字列のためauto_incはfalse
public $incrementing = false;
// パスワードのカラムを取得するように
public function getAuthPassword(){
return $this->pass;
}
...
}
問題
ここまで行ってログインできるユーザー情報を渡してもAuth::attempt()はfalseを返す...
構造が変わったので対応する形の配列で渡していました。
Auth::attempt(['userID' => 'hoge', 'pass' => 'fuga']);
Userクラスで該当のユーザーは取得できているのでテーブルは見れています。
既存テーブルを利用する元のシステムではログインできるので、当然パスワードなどは有効です。
結論
attempt()に渡す配列は 'password' で渡すこと。
今回でいえば以下の形の配列が必要ということになります。
Auth::attempt(['userID' => 'hoge', 'password' => 'fuga']);
悩んでいる箇所のズバリそのもの、こちらの記事が見つかりました。
'password'固定で渡してやる必要がありました。
まとめ
Laravelの認証機能を拡張して既存テーブルから認証することができました。
'password'固定となっているのは盲点でしたが、せっかくのフレームワークならテーブルもマイグレーションで管理しているテーブルを使える方が楽ですね。
試行錯誤内容
どこでつまずいているか切り分けるために行った内容を備忘録として残しておきます。
-
そのままAuth::attempt()を実行する※それぞれのテーブルからはデータが取れている
1.1. usersテーブルで['email' => 'hoge', 'password' => 'huga']を渡す => ture
1.2. loginテーブルで['userID' => 'hoge', 'pass' => 'huga']を渡す => false -
usersの構造で実施
2.1. テーブル名のみ変更し['email' => 'hoge', 'password' => 'huga']を渡す => true
2.2. emailをuserIDに変更し['userID' => 'hoge', 'password' => 'huga']を渡す => true
2.3. passwordをpassに変更(getAuthPasswordなど追加)し['userID' => 'hoge', 'pass' => 'huga']を渡す => false -
loginのpassをpasswordに変更(protected $rememberTokenName = false;を追加)し['userID' => 'hoge', 'password' => 'huga']を渡す => true
-
loginテーブルに合わせ、['userID' => 'hoge', 'password' => 'huga']を渡す => true
参考文献
- https://qiita.com/idylwork/items/fee405d9a711609337e2
- https://qiita.com/SkipEveryLunch/items/34ac59e987ecaa154ed3
- https://qiita.com/n_oshiumi/items/a466ff2c8f20c3494538
- https://zakkuri.life/laravel-auth-by-other-table/
- https://github.com/laravel/framework/blob/10.x/src/Illuminate/Auth/EloquentUserProvider.php#L151