質問: こんにちは、簡単なログインシステムを作っています。 やりたいのは以下に示したパスワードポリシーに基づき、パスワードチェックを行うことです。 * 桁数チェック: 6文字以上 32文字以下 * 文字チェック:英字のみ、数字のみでも可 * 記号の使用自体は可とし、使える文字種は、!@#$%^&*()_+-=[]{};:?,. Cakephp3の認証を使ってログイン機能を実装しましたが、Cakephp3のValidationを使うとハッシュ化されたパスワードがValidationされてしまい、32文字を超え、正常に動きませんでした。(他のフィールドは上手くチェックされています。) ``` // UsersTabel.phpの一部 public function validationDefault(Validator $validator) { $validator ->scalar('password') ->notEmpty('password',__('パスワードを入力してください。')); ->lengthBetween('password', [6, 32], __('最小6~最大32桁数で入力してください。')); ->add('password', 'alphaNumeric', [ 'rule' => ['custom','/^(?=.*[0-9])(?=.*[A-Za-z])(?=.*[!@#$%^\[\\\]\&*()+-={};:?,._]$/i'], 'message' => '半角英数字のみで入力してください。' ]); } ``` そこで、パスワードのみBootstrapのValidatorを使うという方法で試してみましたが、やはり正常に動きませんでした。正規表現式を消すと動きますが、正規表現式を入れるとSubmitボタンが押せなくなります。 ``` //Add.ctpなどのビューファイルの一部(BootstrapValidator.jsと.cssはCDNでリンク。) ``` 質問は、2つです。 0.Cakephp3のValidationを使い、上記のパスワードポリシーに基づき、Validationできる方法はありませんか?例えば、モデル(UsersTabel.php)ではなくてコントローラー(UsersController.php)でValidationをするとハッシュ化される前にできそうですが...公式サイトを色々みた結果、モデルのないフォームというものが気になりますがあまり理解できませんでした。 1. 半額英数字と記号「!@#$%^&*()_+-=[]{};:?,.」のみ入力制限する正規表現式の正しい書き方を教えていただけますでしょうか。自分が書いたものは以下のようです。 ``` /^[a-zA-Z0-9!@#$%^&*()_+-=[]{};:?,.]+$/ ``` どうそよろしくお願いいたします。
回答: > > 半額英数字と記号「!@#$%^&*()_+-=[]{};:?,.」のみ > > > 文字クラスの中では"-"は範囲を示します。ただし、文字クラスの先頭か末尾にあれば"-"とマッチします。 また、"]"をエスケープしないと文字クラスの終了とみなされます。念のため"["もエスケープしておきましょうか。 したがって、次のようになります。 ``` /^[a-zA-Z0-9!#$%&()*+,.:;=?@\[\]^_{}-]+$/ ```