Spring + Hibernate更新密码

时间:2014-06-05 12:51:38

标签: spring hibernate spring-security

我有一个管理面板,我可以在其中添加用户。 在插入表单中,我有USERNAME,PASSWORD(没有确认密码),以及一些普通字段,如姓名,姓氏,....

当我插入一个新用户时,我希望hibernate将验证它:

  • 用户名不为空
  • db中的唯一用户名(表格上有唯一索引)
  • 密码不为null(目前没有长度控件)
直到这里,一切正常。

将来我将存储加密密码, 在编辑表单中,我有正常的可编辑字段,如用户名,名称, 但我没有输入密码。相反,我把新的密码字段,以防万一我想改变它(不是强制性的)。

我的编辑表单

<!-- 
- username 
-->                                                                 
<div class="form-group">
   <label class="col-sm-4 control-label">Username*:</label>
   <div class="col-sm-8" ><input class="form-control" type="text" data-th-field="*{username}" placeholder="Username" th:errorclass="'has-error-input'"></input></div>
</div>  


<!-- 
- password 
- fingo password
-->                                                                 
<div class="form-group">
   <label class="col-sm-4 control-label">Password:</label>
   <div class="col-sm-8" >******</div>
</div>  


<!-- 
- new password
- (if i want to change it) 
-->                                                                 
<div class="form-group">
   <label class="col-sm-4 control-label">New Password:</label>
   <div class="col-sm-8" ><input class="form-control" type="password" id="password_new" name="password_new" placeholder="New Password"></input></div>
</div>  

正如您所看到的,password_new字段是普通标记,不使用spring表示法。我将在控制器中检索此参数作为参数,我将检查是否写入了新密码。

现在问题:当我提交表单时,我收到验证错误,因为密码为空。 我问你这个问题:

  1. 我是一个很好的方法吗?

  2. 是否可以在更新时跳过hibernate中的验证(密码), 但在插入时设置为强制性?然后更新除以外的所有字段 密码(你会看到我评论了这一行 userToUpdate.setPassword(user.getPassword());)?

  3. 可以更好地从编辑表单中删除新密码字段,然后进行更改 我只更新密码的页面中的密码?

  4. 设置一个名为&#39; password&#39;的隐藏字段是一个愚蠢/不安全的想法。在包含加密密码的编辑表单中,所以它不会给我验证错误?想一想,我认为这不是一个好主意,因为有人可以看到加密密码只看页面的源代码。加密密码&#34;明确&#34; <危险/不安全?

  5. User.java(型号)

    @NotNull(message = "PASSWORD cannot be null")
    @NotEmpty(message = "PASSWORD cannot be null")
    @Size(max = 50, message = "Max 50 char")
    @Column(name = "password", length = 50)
    private String password;
    

    UserDao.java

    @Override
    public void updateUser(User user) throws UserNotFoundException {
        User userToUpdate = getUser(user.getId());
        userToUpdate.setUsername(user.getUsername());
        //userToUpdate.setPassword(user.getPassword());
        userToUpdate.setNome(user.getNome());
        userToUpdate.setCognome(user.getCognome());
        userToUpdate.setEmail(user.getEmail());
        userToUpdate.setEnabled(user.getEnabled());
        userToUpdate.setRole(user.getRole());
        getCurrentSession().update(userToUpdate);
    }
    

    UserController.java

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public String editingUser(@Valid @ModelAttribute User user,
            BindingResult result, RedirectAttributes redirectAttrs,
            @RequestParam(value = "action", required = true) String action,
            @RequestParam(value = "password_new") String password_new
            ){
    
        logger.info("IN: User/edit-POST: " + action);
    
        List<Role> user_roles = RoleService.getRoles();
    
    
        if (action.equals("abort")) 
        {   
            /**
             * message
             */           
            String message = "Edit not saved";          
            redirectAttrs.addFlashAttribute("message", message);
            redirectAttrs.addFlashAttribute("message_class", "alert-warning");
    
            redirectAttrs.addFlashAttribute("user_roles", user_roles);
        } 
        else if (result.hasErrors()) 
        {
            logger.info("User-edit error: " + result.toString());
            redirectAttrs.addFlashAttribute("org.springframework.validation.BindingResult.user", result);
    
            redirectAttrs.addFlashAttribute("user", user);
    
                        /** 
                        * as in my list page i have also the insert form, 
                        * i need to populate the select
                        */
            redirectAttrs.addFlashAttribute("user_roles", user_roles);
    
            return "redirect:/users/edit?id=" + user.getId();
        } 
        else if (action.equals("save")) 
        {
    
            try 
            {
                logger.info("User/edit-POST:  " + user.toString());
    
    
                /**
                 * i see if i changed the password
                 */
                logger.info("new password:  " + password_new);
    
                if (!password_new.equals(""))
                        {
                            user.setPassword(password_new);
                        }
                        else
                        {
                            //nothing, or what?
                        }
    
                        /**
                        * now i can update the user in DB
                        */
                UserService.updateUser(user);
    
                /**
                 * message
                 */            
                String message = "User edited with success";            
                redirectAttrs.addFlashAttribute("message", message);
                redirectAttrs.addFlashAttribute("message_class", "alert-success");
    
    
                        /** 
                        * as in my list page i have also the insert form, 
                        * i need to populate the select
                        */
                redirectAttrs.addFlashAttribute("user_roles", user_roles);
            }
            catch (UserNotFoundException e)
            {
                logger.info("User/edit-POST:  id [" + user.getId() + "] not found");
    
                String message = "User id [" + user.getId() + "] not found!";           
                redirectAttrs.addFlashAttribute("message", message);       
                redirectAttrs.addFlashAttribute("message_class", "alert-danger");                       
            } 
        }
    
        return "redirect:/users/list";
    }
    

    非常感谢

    PS。 因为它是我在spring / hibernate / java中的第一个应用程序,现在我存储普通密码,将来我会加密它们。

2 个答案:

答案 0 :(得分:1)

  1. 不确定<!/ p>

  2. 仅当您删除@Valid注释时。您可以做的是删除注释,然后在控制器中设置所有属性,并在调用DAO函数之前手动验证实体:

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();
    Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
    
  3. 由您决定。

  4. 是的,不要那样做:)

答案 1 :(得分:0)

  

•username not null

您可以在模型中使用@NotNull

  

•db中的唯一用户名(表格上有唯一索引)

而不是在插入时,您可以在表单上的用户名字段失焦时进行AJAX调用,以检查输入的用户是否退出。

  

更新时,您希望更新字段而不更新密码(如果为空)

首先,我想告诉您域模型中的NotEmptyNotNull注释。我在实践中不使用@NotNull和@NotEmpty验证,你可以参考this article

您可以使用休眠dynamic-update仅更新那些已更改的属性。完成this

您可以在编辑表单上使用密码字段,根据您的想法,您可以验证用户是否在密码字段中输入内容然后需要更新其他方面首先从DB设置更新对象获取对象然后调用hibernate更新对象

更好的方式

更改模型正如您所说,您想要使用用户FirstName,LastName,应该在Person模型中的其他个人详细信息以及LoginAccount模型中所有与登录帐户相关的部分

所以你的模型就像:

  • PERSONID
  • 名字

登录账号

  • LoginAccountId
  • 用户名
  • 密码
  • FK_PersonID

您可以为新注册表单创建viewmodel并更改密码并编辑配置文件功能以更新详细信息。