Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保存到数据库时单次忽略字段_Java_Spring_Hibernate_Spring Mvc_Jpa - Fatal编程技术网

Java 保存到数据库时单次忽略字段

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)

场景:我有一个用户实体,我创建一个用户,其中密码由BCryptPasswordEncoder编码。然后我有一个表单,可以编辑我的用户。我是这样做的:

@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:/不要从表单对象填充密码