处理spring-mvc上的密码确认

时间:2010-08-17 14:56:45

标签: java spring spring-mvc

我在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;

我解决了如何在此question中显示Authority课程。

现在我愿意我的表单能够有第二个密码字段来确认用户是否正确输入了密码。

我不想在模型中添加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;
 }

3 个答案:

答案 0 :(得分:5)

在您的applicationUserFrom类中添加 confirmPassword 并在setter中添加检查功能 这是我最好的方式

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;
    }
}

答案 1 :(得分: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());
}

答案 2 :(得分:0)

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

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