パスワードが BCrypt を使用してハッシュされる認証付きの単純なプレイ フレームワーク アプリケーションを作成しています。
簡単に言えば、私の質問は次のとおりです。JPA エンティティでは、プロパティの get メソッドを呼び出すと、その set メソッドも何らかの形で呼び出されることがわかりました。セット方法。
ここで私の問題の簡単な例を説明します
これは私のログインビューです
@helper.form(routes.Application.authenticate) {
<h3>Login</h3>
<ul id="login_box">
<li>
<span class="loginbox_label">Username : </span>
<input type="text" class="login_input" id="usernm-input" name="email" value='@form("email").value' placeholder="Enter Username..." />
</li>
<li>
<span class="loginbox_label">Password : </span>
<input type="password" class="login_input" id="passwd-input" name="password" placeholder="Enter Password..." />
</li>
<li>
@if(form.hasGlobalErrors) {
<p class="error">
@form.globalError.message
</p>
}
</li>
</ul>
<hr />
<a href="#" onclick="javascript:window.location.href = '@routes.Application.forgotpwd()?usr='+$('#usernm-input').val()" class="forgotpwdlink">Retrieve Forgotten Password</a>
<input type="submit" class="alt_btn login_btn" value="Login" />
<hr />
}
送信すると、認証機能に移動します
@play.db.jpa.Transactional
public static Result authenticate(){
Form<Login> loginForm = form(Login.class).bindFromRequest();
if(loginForm.hasErrors())
{
return badRequest(index.render(loginForm));
}
else
{
//Save Email to session
session("email", loginForm.get().email);
//Redirect to dashboard
return redirect(routes.Application.showDashboard());
}
}
これは私のログインクラスです
public static class Login
{
public String email;
public String password;
public String validate()
{
User usr = User.findByEmail(email);
if(usr == null)
return MessageStrings.USER_NOT_FOUND; //User Not Found
if(usr.getPassword().equals(this.password))
{
return MessageStrings.NO_ERROR; //NO ERROR
}
else
{
return usr.getPassword();//MessageStrings.PASSWORD_MISMATCH; //Wrong Password
}
}
}
ご覧のとおり、usr.setPassword メソッドを呼び出していません。また、else 部分で usr.getPassword() を返して、それを返してエラー メッセージの代わりにページに表示しています。
最後に、これはJPAエンティティである私のユーザークラスです
@Transient
@Constraints.Required
@Formats.NonEmpty
private String password;
@Access(AccessType.PROPERTY)
@Column(name = "password")
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password = password + "1";//BCrypt.hashpw(password, BCrypt.gensalt());
}
完全な JPA エンティティへのリンク: http://pastebin.com/HZDEyYHZ
ここでは、コードの関連部分のみを追加しました。コードを見ると、フォームを送信するたびに、保存されているパスワードを返す必要があることがわかります (else 部分で usr.getPassword() を返すため)。this.password = password + "1";に注意してください。.
間違ったパスワードで送信し続けると、これが得られます
ログインフォームを送信するたびに、明らかに setPassword が繰り返し呼び出されています
なぜこうなった?
非常に長い投稿、私は知っています