0

ユーザー名、パスワード、メールアドレスの3つのフィールドを持つグループドメインオブジェクトがあります。オブジェクトを保存する前に、メールアドレスを難読化して、ビジネス要件としてデータベースにプレーンテキストで保存されないようにします。

ドメインオブジェクトでvalidateを呼び出すと、奇妙な動作に気づきました。フィールドの制約は次のとおりです。

    userName (nullable: false, unique: false,blank: false, size: 4..200,widget: "textField", matches: "[a-zA-Z0-9, .-@#~{}!£%&*^()-_]+")
    password (nullable: false, unique: false,blank: false, size: 4..200,widget: "textField", password: true, matches: "[a-zA-Z0-9, .-@#~{}!£%&*^()-_]+")
    emailAddress (nullable: false, unique: false,blank: false, size: 5..200,widget: "textField",email: true, matches: "[a-zA-Z0-9, .-@#~{}!£%&*^()-_]+")

オブジェクトについては、すべての値が期待どおりであることを確認するために検証します(emailAddressはまだ難読化されていません)有効な場合は、電子メールアドレスを難読化してから、validate:falseの値でsaveを呼び出します。

奇妙な動作は次のとおりです。有効な電子メールアドレスと有効なパスワードを入力すると、オブジェクトは空白にできないため、userNameフィールドでの検証に失敗します。

有効なメールアドレスと有効なユーザー名を入力すると、パスワードフィールドとメールアドレスでオブジェクトの検証に失敗し、メッセージにメールアドレスの難読化された値が表示されます

最初は難読化が問題の原因だと思いましたが、パスワードフィールドが入力された場合は問題なく機能します。どちらのシナリオでもまったく同じコードフローです。

メールアドレスを難読化した後、パスワードフィールドが入力されないシナリオで、grailsがvalidateメソッドを呼び出している可能性はありますか?

コードフローは次のとおりです

        def userLoginUserInstance = UserLoginUser.get(params.id)
        userLoginUserInstance.properties = params

        if (userLoginUserInstance.validate()) {
            //perform updates to database by obfuscating email address first - working fine
        } else {
                def newObfuscatedEmailAddress =  userLoginUserInstance.emailAddress.encodeAsBase64();

                userLoginUserInstance.setEmailAddress(newObfuscatedEmailAddress);

                render(view: "edit", model: [userLoginUserInstance: userLoginUserInstance])
        }

検証が失敗したときに電子メールアドレスが難読化される理由は、gspが電子メールアドレスをdeObfuscatesするよりもゲッターを持つ一時変数を読み取るためです。ユーザー名が設定されていない場所で上記のコードを実行すると、正常に機能し、メールアドレスは正常であると表示されます。パスワードが空白の場合、パスワードのエラーが表示されますが、難読化された電子メールアドレスも無効として表示されます。

さらに分析すると、次のコード行を実行すると検証の問題が発生します

 userLoginUserInstance.setEmailAddress(newObfuscatedEmailAddress);

userLoginUserInstanceがデータベースから取得されるときに、これが発生する理由を理解しています。私を混乱させるのは、これがすべてのシナリオで発生するわけではないということです

4

2 に答える 2

1

Base64電子メールの制約がある属性に文字列を格納しようとしているため、検証エラーが発生しています。

"foo@bar.com".encodeAsBase64()

結果は

Zm9vQGJhci5jb20=

したがって、Userエンティティがデータベースに再度フラッシュされると、もちろん別の検証が行われ、これは有効な電子メールアドレスではないと不平を言います。

すべてのシナリオで検証エラーが発生しない理由は、user.save()norを強制しないためuser.save(flush:true)です。

これは、電子メールアドレスがアドホックで更新されないことを意味しますが、しばらくしてからです。何が起こっているかをよりよく確認するには、電子メールが割り当てられた後に別の検証ブロックを追加します。

于 2013-02-12T19:34:58.737 に答える
0

これに早く戻らなくてすみません

データベースのオブジェクトではなく、新しいオブジェクトをビューに戻すことでこれを解決しました。メールアドレスを難読化する必要があるため、このユースケースは非常に複雑です。

この1人の人とあなたの助けをありがとう

よろしくダミアン

于 2013-03-01T20:14:52.383 に答える