Laravelのパスワードの複雑性バリデーション

どうもこんにちは。

ユーザのパスワードを設定するとき、複雑性を要求されることが多いですよね。
今回は、複雑性を満たしているかをチェックするために、
バリデーションルールをつくってみました。


作ったもの

早速ですが、コレを作りました。

2019/06/18 指摘があったので、一部修正しました。
MSさん、ありがとうございます。

 


簡単な解説
コンストラクタ

コンストラクタでは

  • 最小文字数
  • 最大文字数(null -> 無制限)
  • パスワードに記号を含めるてよいか
  • 1文字以上の半角英字(大文字)を含む必要があるか
  • 1文字以上の半角英字(小文字)を含む必要があるか
  • 1文字以上の半角数字を含む必要があるか
  • 1文字以上の半角記号を含む必要があるか

を決めています。

public function passes($attribute, $value)

コンストラクタで与えられた値をもとに、
正規表現を組み立てています。
デフォルトのままであれば、最終的に

return preg_match("/\A(?=.*?[!-\/\:-@\[-`\{-~])(?=.*?\d)(?=.*?[A-Z])(?=.*?[a-z])[!-~]{8,}+\z/", $value);

となります。

あまり見慣れない”(?=xxxx)”があります。これは、「肯定先読み」と呼ばれるものです。
例えば
(?=.*?\d)だと、.*?\dの直前の文字にマッチします。
.は改行以外の任意の1文字、
*?は非貪欲的な正規表現(後に続く文字が1回でもマッチしたらそれ以降判定しない)、
\d0-9と同義なので
つまり、
「改行以外の任意の1文字が0回以上繰り返されたのあとに半角数値が最低1文字続く」

「半角数値が最低1文字ある」
という条件で文字列を先に探しておく、ということ(らしい)です。
これを、半角記号、半角英字(大文字)、半角英字(小文字)と連結させて、
「半角記号、半角英字(大文字)、半角英字(小文字)、半角数値を1文字以上含む」
を表現しています。

public function message()

ただ、メッセージをいい感じに作っているだけです。


さいごに

半分、正規表現の話でした。

r.tanakaがお届けしました。

“Laravelのパスワードの複雑性バリデーション” への 2 件のフィードバック

  1. 正規表現で難儀してたので助かりました。
    72行目
    if ($this->includeLessThanOneNumber) {
    は$this->includeLessThanOneSymbolですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です