Open4

古いLaravelアプリをLaravel 11に(考えなしに)アップデートしたらユーザーパスワードが吹っ飛んだ

AkiAki

Laravel 11ではパスワードのハッシュ要件が変わった場合、ログイン時に自動的に再ハッシュする機能が備わっており、デフォルトで有効。
https://laravel.com/docs/11.x/upgrade#password-rehashing

ドキュメントの通り、通常は問題ないはずだが古いプロジェクトをアップデートする際、条件によってはログイン時にパスワードが二重にハッシュ化され破損する恐れがあった。

AkiAki

TL;DR

以下のような古く(そして問題がある)パスワードハッシュ機構がモデルにある場合は注意が必要。
昔のネット記事だとわりとヒットすることが多かった。

    public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = Hash::make($value);
    }
AkiAki

上記のsetPasswordAttributeの実装では既にハッシュ化された値かどうかのチェックがないため、二重にハッシュ化されてしまう。
結果として元のパスワードでログインできなくなり、おそらく復号も困難な状態に陥ってしまう。

    public function setPasswordAttribute($value)
    {
        if (Hash::isHashed($value)) {
            $this->attributes['password'] = $value;
            return;
        }
        $this->attributes['password'] = Hash::make($value);
    }

のように既にハッシュされていればそのままにするように修正するか、Laravel 10以降で使用できるhashedキャストを使うのが良いだろう。

    protected $casts = [
        'password' => 'hashed',
    ];