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

Laravel 11ではパスワードのハッシュ要件が変わった場合、ログイン時に自動的に再ハッシュする機能が備わっており、デフォルトで有効。
ドキュメントの通り、通常は問題ないはずだが古いプロジェクトをアップデートする際、条件によってはログイン時にパスワードが二重にハッシュ化され破損する恐れがあった。

TL;DR
以下のような古く(そして問題がある)パスワードハッシュ機構がモデルにある場合は注意が必要。
昔のネット記事だとわりとヒットすることが多かった。
public function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}

先ほど述べたようにLaravel 11ではAuth::attempt()時にパスワード再ハッシュが必要かチェックして必要な場合にパスワードを再ハッシュする。
そしてその条件となるbcryptのラウンド数のデフォルト値がLaravel 10で12に引き上げられている。
Laravel 9以前
Lavavel 10
そのため再ハッシュが実行されるのだが、この際にハッシュ化済みの値がfillされる。

上記の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',
];