2010-08-17 58 views
2

我正在做spring-mvc的用户crud。在spring-mvc上处理密码确认

我的模型具有以下属性:

private Long id; 
private String password; 
private String username; 
private Collection<Authority> myAuthorities; 
private boolean isAccountNonExpired; 
private boolean isAccountNonLocked; 
private boolean isCredentialsNonExpired; 
private boolean isEnabled; 

我解决了如何显示在这个questionAuthority类。

现在我愿意我的形式才能够有第二个密码字段,以确认用户输入正确的密码。

我不想一个confirmPassword属性添加到模型,所以我的问题是如何解决这个可能的最好的方式。

编辑:

一切工作与axtavt的答案,但我缺少一个方法来验证。 我在我的控制器中有以下方法,但即使我放置了一个@Validate ApplicationUserFormValidator未被调用。

@RequestMapping(method = RequestMethod.POST) 
public ModelAndView create(Model model, 
    @Valid @ModelAttribute ApplicationUserForm applicationUserFrom, 
    BindingResult result) { 
    ModelAndView modelAndView = new ModelAndView(); 

    if (result.hasErrors()) { 
    modelAndView.setViewName(USER_CREATE_FORM); 
    } else { 
    modelAndView.setViewName(REDIRECT_TO_USER_LIST); 
    modelAndView.addObject(USER_FORM_MESSAGE, USER_FORM_ADD_SUCCESSFUL); 
    applicationUserService.save(applicationUserFrom.getUser); 
    } 

    return modelAndView; 
} 

回答

2

您可以创建一个封闭的对象,以保持一个确认:

public class ApplicationUserForm { 
    private ApplicationUser user; 
    private String confirmPassword; 

    ... 
} 

-

Password: <form:password path = "user.password" /> 
Confirm password: <form:password path = "confirmPassword" /> 

验证也能正常工作:

public class ApplicationUserFormValidator implements Validator { 
    public void validate(Object target, Errors errors) { 
     ApplicationUserForm f = (ApplicationUserForm) target; 

     if (!f.getConfirmPassword().equals(f.getUser().getPassword())) ... 

     errors.pushNestedPath("user"); 
     new ApplicationUserValidator().validate(f.getUser(), errors); 
     errors.popNestedPath(); 
    } 
    ... 
} 

编辑:如果使用@Valid注解,您需要使用@InitBinder注册验证器,或者在docs中描述的配置中注册验证器。您也可以使用完全声明式的JSR-303风格验证,但我不确定它将如何应对业务限制,如user.password == confirmPassword

@InitBinder 
public void initBinder(WebDataBinder b) { 
    b.setValidator(new ApplicationUserFormValidator()); 
} 
+0

第一部分很好,但我只是编辑我的问题,添加验证问题。 你能帮我解决这个问题吗? – Macarse 2010-08-17 18:37:59

+0

@Macarse:编辑。 – axtavt 2010-08-17 19:00:15

+0

很酷,我发现在寻找解决方案时,在文档中,但如果我这样做,我会在我的模型中丢失JSR-303注释。例如,我的模型有:@NotNull \t @Size(min = 6,max = 12) \t private String username; – Macarse 2010-08-17 19:09:51

0

我处理这个问题的方法是把密码确认和“你确定要这么做吗?”确认到在控制器中实施细粒度访问控制规则的访问策略对象中。

而不是一切从头实现用户管理,您可以使用一个现成的,现成的解决方案;例如Emmet。 (免责声明 - 我是作者。)

+0

我想我没有正确地解释自己。 我需要我的表单以获得密码的第二个字段。例如: 密码: 确认密码: 然后使用验证程序检查密码是否相等。 – Macarse 2010-08-17 15:22:06

5

添加confirmPassword在applicationUserFrom类
并添加校验功能在二传手
这是我最好的办法

private String password; 
@NotNull(message="not match") 
private String confirmPassword; 

public void setPassword(String password) { 
    this.password = password; 
    checkPassword();//check 
} 

public void setConfirmPassword(String confirmPassword) { 
    this.confirmPassword = confirmPassword; 
    checkPassword();//check 
} 

private void checkPassword() { 
    if(this.password == null || this.confirmPassword == null){ 
     return; 
    }else if(!this.password.equals(confirmPassword)){ 
     this.confirmPassword = null; 
    } 
}