场景:我有User
个实体,我创建用户,其中密码由BCryptPasswordEncoder
编码。然后我有编辑我User
的表单。我是这样做的:
@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;
}
}
问题:当我提交编辑表单时,我的密码更改,我无法登录到我的帐户。有没有办法保存User
,例如用户名和密码字段?或者有没有更好的方法来实现这个目标?
答案 0 :(得分:1)
基本上,您的数据库存在设计问题,即您的数据库设计将安全性详细信息与其他详细信息混淆。
要通过保留现有设计来解决问题,您可以使用以下方法,但我强烈建议将数据分开。
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时,它仍会填充。它 从数据库获取密码,我正在寻找解决方案,仍然使用 用户作为表单,但避免干扰密码。
另一个最简单的选项是您可以通过编写HQL查询(在Hibernate中)来更新特定字段,即排除密码