【问题标题】:Change password for user in database更改数据库中用户的密码
【发布时间】:2017-10-23 07:33:46
【问题描述】:

我的问题是更改登录系统的用户的密码。它打印出新密码已成功更改,但是当我检查它时,密码保持不变并且没有更改。是因为我使用 set.Password 吗?还有其他方法吗?此代码尝试使用用户名检索员工。

已更新:Alex 的精彩回答以及其他建议已解决了这个问题!谢谢你们。

这是调用遥控器的方法

 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");
    }
    }

在另一个程序中,无状态会话 bean 称为employeeController。该方法在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();
}

感谢大家的宝贵时间! :)

【问题讨论】:

  • 在输入新用户之前,首先应检查用户是否存在且当前密码是否正确。
  • 设置密码后需要flush更新数据库。
  • 请告诉我们,当您更新其上的字段时,该对象处于什么对象生命周期状态(托管、分离、瞬态?)?因为这决定了您需要做什么来获取数据库中的更改。根据 JPA 规范 ...
  • 您可以将传递到客户端并返回到服务器端的employee 分离。因此,如果您再次尝试 persist 它,它会说它是重复的,因为 JPA 将尝试“插入”而不是“更新”

标签: java jpa stateless-session-bean


【解决方案1】:

您不应该在 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 中再次检查旧密码,以避免绕过客户端检查的攻击。

【讨论】:

  • 嗨!谢谢你的建议。我现在就试试:)
  • 嗨!非常感谢您提供此解决方案。它解决了我的问题。就像你说的那样,它在客户端,所以它没有直接更新数据库。通过您的方法(无状态会话 bean)完成它之后,它起作用了。谢谢!
【解决方案2】:

您需要保留更改的实体/数据。 entityManager.persist(employee);设置新密码后。

以下是一些其他提示:

不应进行强制转换。您可以对此进行修改。

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

您的工作流程应该是:

  1. 输入userName
  2. 检查user 是否存在(按名称)
  3. 输入currentPassword, newPassword, newPasswordConfirm
  4. 更改值
  5. 保留您的User/Employee,这样更改也将在数据库中。无需将其保存在 DB 中,您只需更改本地使用的 Object-Instance。

【讨论】:

  • 也许您在所有交互之后还没有添加commit()?所以更改并没有真正完成并且有回滚?
  • 你正在使用方法变量,那么在doChangePassword() 之后你怎么能做到这一点?在setPassword() 之后添加合并/持久化,并查看您的数据库 - 不仅是您的代码。
  • 我不小心删除了之前的评论。但我现在会检查代码。 :) 谢谢您的帮助。将再次更新。
  • 嗨!感谢您的帮助!我的问题已经解决了。我只需要在会话 bean 中更新我的密码,而不是在客户端更改它。
【解决方案3】:

您应该使用其中一种“保存、持久化、更新、合并、saveOrUpdate”

尝试使用 EntityManager.merge 方法 - 这非常相似。

employee.setPassword(newPassword);   
em.merge(employee);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多