0

パスワードが 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 が繰り返し呼び出されています

なぜこうなった?

非常に長い投稿、私は知っています

4

1 に答える 1

1

エンティティのプロパティアクセスを明示的に選択しました。これは、エンティティを設定するためにセッターが呼び出されることを意味します。しかし、あなたのセッターは実際にはセッターではありません。したがって、このメソッドの名前を別の名前に変更し、実際のセッターを追加するか、プロパティアクセスではなくフィールドアクセスを使用します。

私見ですが、パスワードのハッシュはエンティティによって行われるべきではなく、セッターによって行われるべきではありません。予想される動作は、ゲッターがセッターによって設定された値を返す必要があることです。

于 2013-01-31T18:29:32.180 に答える