Java 保存到数据库时单次忽略字段
场景:我有一个用户实体,我创建一个用户,其中密码由BCryptPasswordEncoder编码。然后我有一个表单,可以编辑我的用户。我是这样做的:Java 保存到数据库时单次忽略字段,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,场景:我有一个用户实体,我创建一个用户,其中密码由BCryptPasswordEncoder编码。然后我有一个表单,可以编辑我的用户。我是这样做的: @Controller @RequestMapping("/users") @SessionAttributes("userForm") public class UserController { @RequestMapping(value = "/{userId}/edit", method = RequestMethod.GET)
@Controller
@RequestMapping("/users")
@SessionAttributes("userForm")
public class UserController {
@RequestMapping(value = "/{userId}/edit", method = RequestMethod.GET)
public String showEditUserForm(@PathVariable("userId") long userId,
Model model) {
model.addAttribute("userForm", userService.findUserById(userId));
return "userEdit";
}
@RequestMapping(value = "/{userId}/edit", method = RequestMethod.POST)
public String editUser(@Valid @ModelAttribute("userForm") User
userForm, BindingResult bindingResult,
@PathVariable("userId") long userId, Model model, SessionStatus status) {
if (bindingResult.hasErrors()) {
return "userEdit";
} else {
userService.save(userForm);
status.setComplete();
return "redirect:/users/" + userId;
}
}
问题:当我提交编辑表单时,我的密码更改,我无法登录到我的帐户。除了用户名和密码字段外,是否有其他方法保存用户信息?或者有没有更好的方法来实现这一点?基本上,您的数据库存在一个设计问题,即,您的数据库设计混淆了安全细节和其他细节 要通过保留现有设计来解决此问题,您可以使用以下方法,但我强烈建议将数据分离出来
if (bindingResult.hasErrors()) {
return "userEdit";
} else {
User userDB = userService.findUserById(userId);
//compare the new & db values
//i.e., userForm and userDB and then update to userDB
//userDB.setX(userForm.getX());
//IGNORE PWD FIELDS, DO NOT UPDATE THEM TO userDB object
userService.save(userDB);
status.setComplete();
return "redirect:/users/" + userId;
}
此外,我建议不要获取密码等安全细节。。从数据库中删除,除非视图绝对需要它们
在GET方法中初始化userForm时,它仍然会填充。信息技术
从数据库中获取密码,我正在寻找解决方案,以便继续使用
用户作为表单,但避免干扰passw
另一个最简单的选项是,您可以通过在Hibernate中编写HQL查询来更新特定字段,即不包括密码,因此可能有更好的方法来编辑用户详细信息,而不是从DB处理对象?您可以将对象保留在HttpSession中,但是我建议不要这样做,因为数据是敏感的,我让我的用户在会话中。除了这个密码,其他一切都正常工作:/PasswordEncoder再次散列相同的密码,之后我无法访问我的帐户。我认为它是这样工作的:P.比较userForm和userFromDB没有帮助。密码仍然被再次编码,并且这个新密码被保存到DB:/不要从表单对象填充密码