2017-10-23 23 views
1

私の質問は、システムにログインしているユーザーのパスワードを変更することです。新しいパスワードが正常に変更されたことが表示されますが、確認するとパスワードは変更されていません。私はset.Passwordを使うからですか?他の方法はありますか?このコードは、usernameを使用してEmployeeを取得しようとします。データベースのユーザーのパスワードを変更する

UPDATED:この質問は、Alexの華麗な答えと他の提案とで解決されました。皆さん、ありがとうございました。

これは、リモートコントローラ別のプログラム、employeeController呼ばれるステートレス・セッションBeanで

private void doChangePassword() throws UserNameNotFoundException, EmployeeNotFoundException { 


    Scanner scanner = new Scanner(System.in); 

    System.out.println("*** Administration Panel :: Change Password ***\n"); 
    System.out.print("Enter username> "); 
    String username = scanner.nextLine().trim(); 
    System.out.print("Enter current password> "); 
    String currentPassword = scanner.nextLine().trim(); 
    System.out.print("Enter new password> "); 
    String newPassword = scanner.nextLine().trim(); 
    System.out.print("Enter new password again> "); 
    String reenterNewPassword = scanner.nextLine().trim(); 

    currentEmployee = employeeControllerRemote.retrievePasswordByUsername(username); 
    if (currentPassword.equals(currentEmployee.getPassword())) { 
     if (newPassword.equals(reenterNewPassword)) { 
      currentEmployee.setPassword(newPassword); 
      //Updated here 
      employeeControllerRemote.updateNewPassword(currentEmployee); 

      System.out.println("New Password changed successfully!\n"); 
     } else { 
      System.out.println("New Password mismatched!\n"); 
     } 
    } 
    else { 
     System.out.println("Wrong password, please try again later"); 
    } 
    } 

を起動する方法です。このメソッドはemployeeControllerRemoteとlocalでも実装されています。

@Override 
public Employee retrievePasswordByUsername(String username) throws UserNameNotFoundException { 

    Query query = em.createQuery("SELECT e FROM Employee e WHERE e.username = :inUsername", Employee.class); 
    query.setParameter("inUsername", username); 
    return (Employee) query.getSingleResult(); 
    //Changed it according to suggestions 
} 

これは私が作成した新しい方法です。私はコミットを使用しようとしましたが、動作しませんでした。私はまた、持続性とフラッシュを使用しようとしました。しかし、それは重複していると言われて、違法な議論の誤りがあった。フラッシュはうまく動かず、エラーコードには何もフラッシュされていないと書かれていました。 私はこの新しいメソッドを作成しましたが、retrievePasswordByUsernameメソッドの下に配置しませんでした。そこで私は以下の新しい方法を作りました。それでもまだ動作しません。

@Override 
public void updateNewPassword(Employee employee) { 
    //em.getTransaction().begin(); 
    em.flush(); 
    //em.getTransaction().commit(); 
} 

ありがとうございます! :)

+0

まず、新しいパスワードを入力する前に、現在のパスワードが正しいかどうかを確認してください。 – LenglBoy

+0

パスワードを設定した後、データベースを更新する前に 'flush'する必要があります。 – Alex

+0

は、オブジェクトのフィールドを更新するときにオブジェクトが存在するオブジェクトライフサイクルの状態(管理、分離、一時的な)を教えてください。データベース内の変更を取得するために必要な作業が決定されるためです。 JPA仕様に従って... – DN1

答えて

0

それはクライアント側にあるとしてあなたは、あなたのdoChangePassword()方法でパスワードの更新を行うべきではありません。データベースに何も直接更新することはできません。あなたのステートレスセッションBean経由でそれを行う必要があります。

ステートレスセッションBeanでメソッドを変更して、更新ジョブを実行する必要があります。

@Override 
public void updatePasswordByUsername(String username, String password) throws UserNameNotFoundException 
{ 
    Query query = em.createQuery("SELECT e FROM Employee e WHERE e.username = :inUsername"); 
    query.setParameter("inUsername", username); 
    //query.getSingleResult(); 

    Employee employee = (Employee) query.getSingleResult(); 
    employee.setPassword(password); 
    em.persist(employee);  
} 

次に、ステートレスセッションBeanを通じてクライアント側でこのメソッドを呼び出します。

クライアント側のチェックをバイパスする攻撃を回避するために、ステートレスセッションBeanで古いパスワードを再度チェックする必要があるかもしれません。

+0

こんにちは!提案していただきありがとうございます。私は今それを試してみます:) –

+0

こんにちは!このソリューションをありがとうございます。それは私の問題を解決しました。それはあなたが言ったようでした、それはクライアント側にありますので、データベースを直接更新しませんでした。あなたのメソッド(ステートレスセッションBean)を使ってそれを実行した後、それは働いた。ありがとうございました! –

0

変更されたエンティティ/データを保持する必要があります。 entityManager.persist(employee);新しいPWを設定した後。ここで

は、他のいくつかのヒントです:

はshouldn'tが行われキャストします。これに変更することができます。

Query query = em.createQuery("SELECT e FROM Employee e WHERE e.username = :inUsername", Employee.class); 
query.setParameter("inUsername", username); 
return query.getSingleResult(); // now EMPLOYEE 

あなたのワークフローが可能sould:userが存在する場合は

  1. は(BYNAME)をuserName
  2. チェックを入力し
  3. 入力currentPasswordnewPasswordnewPasswordConfirm
  4. 変更
  5. があなたの永続値User/Employeeだからeの変更もDBになります。 DBに保存せずに、ローカルで使用されたオブジェクトインスタンスを変更しました。
+0

すべてのやりとりの後に' commit() 'を追加していないのでしょうか?変更は本当に行われておらず、ロールバックがありますか? – LenglBoy

+0

そしてメソッド変数を使用していますので、 'doChangePassword()'の後にこれをどのようにすることができますか?短いthestの 'setPassword()'の後にmerge/persistを追加して、あなたのコードだけでなくあなたのDBを見てください。 – LenglBoy

+0

私は以前のコメントを誤って削除しました。しかし、私は今すぐコードをチェックします。 :) 助けてくれてありがとう。再度更新されます。 –

-2

あなたはこれらのEntityManager.mergeメソッドを使用してみてください「セーブ持続、更新、マージ、するsaveOrUpdate」

のいずれかを使用する必要があり - これは非常に似ているが。

employee.setPassword(newPassword); 
em.merge(employee); 
関連する問題