Laravel8のパスワードバリデーションとその日本語化


Laravelのバリデーションオブジェクト

Laravelにはデフォルトでバリデーションルールがあり、これを用いることで容易に簡潔なコードでバリデーションができます。

しかし、「記号を1文字以上含むパスワード」のような複雑なルールに対応しようとすると、長く読みづらいコードになってしまいます。
複雑な要件のバリデーションに対応したい場合は、パスワードルールオブジェクトが便利です。

パスワードルールオブジェクト

通常のバリデーションと同じように定義が可能です。

FormRequest.php
use Illuminate\Validation\Rules\Password;

public function rules()
{
    return [
        'password' => ['required', 'max: 128', Password::min(8)],
]);

定義できるルールには以下があり、これらを組み合わせることも可能です。

ルール一覧
// 最低8文字必要
Password::min(8)

// 最低1文字の文字が必要
Password::min(8)->letters()

// 最低大文字小文字が1文字ずつ必要
Password::min(8)->mixedCase()

// 最低一文字の数字が必要
Password::min(8)->numbers()

// 最低一文字の記号が必要
Password::min(8)->symbols()

// パスワードリストに登録されているか確認
Password::min(8)->uncompromised()

最後のuncompromised()は過去にデータ漏洩したことがあるかを確認してくれます。

例えば、脆弱なパスワードである "password" や "qwerty" などを入力すると引っかかります。ですので、パスワードの要件を縛りすぎることなく一部の危険なパスワードを回避することができます。さらに、半角全角英数字記号も満たしてるが脆弱な "Passw0rd!" などの設定も防ぐことが可能です。

また、引数に数値を入れることで、同一のデータリークにおいて、パスワードの出現回数がn回以下であることを確認することができます。

内部的には、have i been pwned のAPIを利用しているそうです。

日本語化する

次に、日本語化の方法です。

実際に使うとこのような英語のメッセージが帰ってきます。 'パスワード' の文字だけ日本語になっている理由はこちらだけvalidation.phpによって設定されているからです。
バリデーション文の英語部分はvendor/laravel/framework/src/lluminate/Validation/Rules/Password.phpに直に記述されており、validation.phpでは設定できません。

そこで、以下をresources/lang/ja.jsonに追加します。ja.jsonがない場合は作ってください。

resources/lang/ja.json
{
    "The :attribute must contain at least one uppercase and one lowercase letter.":":attributeは、少なくとも大文字と小文字を1つずつ含める必要があります。",
    "The :attribute must contain at least one letter.":":attributeは、少なくとも1つの文字が含まれていなければなりません。",
    "The :attribute must contain at least one symbol.":":attributeは、少なくとも1つの記号が含まれていなければなりません。",
    "The :attribute must contain at least one number.":":attributeは、少なくとも1つの数字が含まれていなければなりません。",
    "The given :attribute has appeared in a data leak. Please choose a different :attribute.":"この:attributeは過去に漏洩したことのある脆弱な:attributeです。別の:attributeを入力してください。"
}

※翻訳内容は適時調整していただいて構いません。

はい、無事に日本語化が完了しました!!
便利な機能なので使っていない方はぜひ使ってみてください!

参考サイト