【问题标题】:Handling password confirmations on spring-mvc在 spring-mvc 上处理密码确认
【发布时间】:2011-03-31 01:09:38
【问题描述】:

我在 spring-mvc 中做一个用户 crud。

我的模型具有以下属性:

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

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    在您的 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;
        }
    }
    

    【讨论】:

      【解决方案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());
      }
      

      【讨论】:

      • 第一部分非常棒,但我只是编辑了我的问题,添加了一个验证问题。你能帮我解决这个问题吗?
      • 酷,我在寻找解决方案时在文档中发现了这一点,但如果我这样做,我会丢失模型中的 JSR-303 注释。例如,我的模型有:@NotNull @Size(min = 6, max = 12) private String username;
      • @Macarse:那你需要 JSR-303 的 ConstraintValidator 而不是 Spring 的 Validatorstatic.springsource.org/spring/docs/3.0.x/…
      【解决方案3】:

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

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

      【讨论】:

      • 我想我没有正确解释自己。我需要我的表单有第二个密码字段。类似于:密码:确认密码:然后使用验证器检查密码是否相等。
      猜你喜欢
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多