4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Advent Calendar 2018

Day 9

Auth::logoutで「remember_tokenフィールドが見当たりません」という例外がスローされた

Last updated at Posted at 2018-12-10

追記(2019/08/01)

Laravel5.8からは考慮不要になりました
https://github.com/laravel/framework/pull/25952

はじめに

既存のプロダクトをLaravelに移植している際に、異なるフレームワークでのログイン状況の同期(?)でつまずいた時の話です
よくあるn番煎じの話だとは思いますのでご了承を・・・

ことのはじまり

既存フレームワークからLaravelに遷移する際、ログインユーザーの整合性をとるようにしており、ユーザーが一致しないこと(既存ではログアウトなのにLravel側ではログイン状態のまま)があるのでそのチェックをMiddlewareでしてました。

単純に一致してないからLaravel側で Auth::logout で抜ければよかったのですが、ここで問題発生
Auth::logout を叩くと「remember_tokenフィールドが見当たりません」という例外がスローされてしまいました・・・

remember_token 自体はログイン維持機能を使うためのトークンを保管するフィールドで、Auth::logoutの時に remember_token が必ず更新されるようです。
https://github.com/laravel/framework/blob/5.7/src/Illuminate/Auth/SessionGuard.php#L478-L534

通常ならばサクッとマイグレーションすれば解決はしますが、既存では別のやり方でログイン維持機能を実装していたので、別の方法で解決策を探してました。

解決策

大体こういうのは英語のサイトに書いてある法則
https://laravel.io/forum/05-21-2014-how-to-disable-remember-token

Userモデルでremember_tokenを書き換えようとしたら、無視するだけでいいようです

/**
 * remember_tokenがカラムにないテーブルでAuth::logout時に存在しないremember_tokenが更新しようとしてエラーになるので無視する
 */
public function setAttribute($key, $value)
{
    if ($key !== $this->getRememberTokenName()) {
        parent::setAttribute($key, $value);
    }
}

おわりに

Laravel自体ドキュメントがしっかりしてたので、内部のソースとにらめっこする機会があまりなかったため、なんとなく動きが把握できたのはよかったところ

ただ、やっぱり既存の機能もLaravelに寄せていかないと同じような弊害がありそうだから考えないといけない危機感ひしひしと・・・・

Laravelを完全に理解する日は遠い・・・

4
4
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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?