更改数据库中用户的密码
Change password for user in database
我的问题是更改登录系统的用户的密码。它打印出新密码已成功更改,但是当我检查它时,密码保持不变并且没有更改。是因为我用了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 和本地也有实现。
@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
}
这是我创建的新方法。我尝试使用 commit 但它没有用。我还尝试使用 persist 和 flush。但是它说它是重复的并且存在非法的争论错误。冲洗效果不佳,错误代码提到没有可冲洗的东西。
我创建了这个新方法,但没有将它放在 retrievePasswordByUsername 方法下,因为我认为它不应该存在,因为它只是检索它?所以我在下面创建了一个新方法。它仍然不起作用。
@Override
public void updateNewPassword(Employee employee) {
//em.getTransaction().begin();
em.flush();
//em.getTransaction().commit();
}
谢谢大家的宝贵时间! :)
您需要保留更改的 Entity/Data。 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
您的工作流程应该是:
- 输入
userName
- 检查
user
是否存在 (byName)
- 输入
currentPassword
、newPassword
、newPasswordConfirm
- 更改值
- 坚持你的
User/Employee
所以改变也会在数据库中。没有将其保存在数据库中,您只是更改了本地使用的对象实例。
你应该使用其中之一 "save, persist, update, merge, saveOrUpdate"
尝试使用 EntityManager.merge 方法 - 这非常相似。
employee.setPassword(newPassword);
em.merge(employee);
你不应该在你的 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 中再次检查旧密码,以避免绕过客户端检查的攻击。
我的问题是更改登录系统的用户的密码。它打印出新密码已成功更改,但是当我检查它时,密码保持不变并且没有更改。是因为我用了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 和本地也有实现。
@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
}
这是我创建的新方法。我尝试使用 commit 但它没有用。我还尝试使用 persist 和 flush。但是它说它是重复的并且存在非法的争论错误。冲洗效果不佳,错误代码提到没有可冲洗的东西。 我创建了这个新方法,但没有将它放在 retrievePasswordByUsername 方法下,因为我认为它不应该存在,因为它只是检索它?所以我在下面创建了一个新方法。它仍然不起作用。
@Override
public void updateNewPassword(Employee employee) {
//em.getTransaction().begin();
em.flush();
//em.getTransaction().commit();
}
谢谢大家的宝贵时间! :)
您需要保留更改的 Entity/Data。 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
您的工作流程应该是:
- 输入
userName
- 检查
user
是否存在 (byName) - 输入
currentPassword
、newPassword
、newPasswordConfirm
- 更改值
- 坚持你的
User/Employee
所以改变也会在数据库中。没有将其保存在数据库中,您只是更改了本地使用的对象实例。
你应该使用其中之一 "save, persist, update, merge, saveOrUpdate"
尝试使用 EntityManager.merge 方法 - 这非常相似。
employee.setPassword(newPassword);
em.merge(employee);
你不应该在你的 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 中再次检查旧密码,以避免绕过客户端检查的攻击。