ユーザー名、パスワード、メールアドレスの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がデータベースから取得されるときに、これが発生する理由を理解しています。私を混乱させるのは、これがすべてのシナリオで発生するわけではないということです