1

パスワードの更新に使用している Grails コマンド オブジェクトがあります。次のようになります。

class UpdatePasswordCommand {

    String password

    static constraints = {
        password blank: false,
                 nullable: false,
                 size: 8..64,
                 matches: someLongRegex
                 validator: { String password, command ->
                     if (someService.isPasswordSameAsUsername(password)) {
                         return 'password.invalid.sameasuser'
                     }
    }

私が尋ねている質問に関係のないものはすべて省略しました。

私が直面している問題は、この検証がトリガーされるたびに、すべての検証がトリガーさcommand.errorsれ、検証の失敗ごとにコレクションにエラーメッセージが表示されることです。これは、たとえば、ユーザーがパスワードにtestを使用しようとすると、次のエラー メッセージが表示されることを意味します。

* Password length must be between 8 and 64 characters.
* Password must not be the same as the user name.
* Password must contain at least one special character, uppercase letter, and digit.

この場合、パスワードの長さが間違っている場合は、その時点で検証を停止したいと考えています。同様に、ユーザー名と同じ場合、正規表現と照合したくありません。特定のプロパティの最初の検証失敗のみを返すように Grails 検証を取得する方法はありますか? プロパティごとにのみ停止することが重要であることに注意してください。たとえば、ユーザーが確認パスワードを入力しない場合でも、2 つのエラー メッセージを表示したいからです。

* Password length must be between 8 and 64 characters.
* You must enter a confirm password.
4

2 に答える 2

0

ユーザーが1つずつ修正するのではなく、一度に修正または処理できるように、すべての検証メッセージを先制的にユーザーに提供することを実践すべきではありませんか?

とにかく、以下のように一度に 1 つのメッセージだけを返すようにプログラムで強制することができます。

    static constraints = {
        password validator: { String password, command ->
                    def errorMsgs = []
                    if (!password){
                        errorMsgs << 'password.invalid.blank' //'password.invalid.null'
                        return errorMsgs
                    } else if (!(password.size() in (8..64))){
                        if (someService.isPasswordSameAsUsername(password)){
                            errorMsgs << 'password.invalid.sameasuser'
                        }
                        errorMsgs << 'password.invalid.length'
                        return errorMsgs
                    } else if (/*password not matching YourRegex*/){
                        errorMsgs << 'password.invalid.specialCharacters'
                        return errorMsgs
                    } else if (someService.isPasswordSameAsUsername(password)){
                        errorMsgs << 'password.invalid.sameasuser'
                        return errorMsgs
                    }
            }
    }

パスワードの長さとユーザー名との一致について上記のように制御ロジックを追加することにより、複数のメッセージが送り返される特殊なケースに対処する必要があると思います。

于 2013-05-17T03:36:05.723 に答える
0

grails validateを見てみましょう。興味深いのは、プロパティ名を に渡すことができることですvalidate()
2 つ目は、Spring のErrorsインターフェイスを実装する errorsプロパティです。これを使用してメッセージをクリーンアップし、プロパティのメッセージを 1 つだけ表示できます。dmahapatro が提案したように、カスタムバリデーターを作成するのが良い方法です。

于 2013-05-17T22:59:57.640 に答える