2010-08-17 46 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; 
    } 
}