2014-06-05 132 views
1

我有一個管理面板,我可以添加用戶。 在插入表單我有用戶名,密碼(沒有確認密碼),以及一些普通的領域,如姓名,....春天+休眠更新密碼

當我插入一個新的用戶,我想,Hibernate會對其進行驗證:

  • 的用戶名在數據庫不爲空
  • 唯一的用戶名(與上表中的唯一索引)
  • 密碼不爲空(就目前來看,沒有長度控制)

直到這裏,everyt興工作正常。

由於將來我會在編輯窗體中存儲加密密碼, ,我有正常的可編輯字段,如用戶名,名稱, ,但我沒有把密碼。相反,我把新的密碼字段,以防萬一我想改變它(不是強制性的)。

編輯表單:

<!-- 
- 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領域是一個普通的標籤,而無需使用彈簧符號。我將在控制器中檢索這個參數,我將檢查是否寫入了新密碼或者不是。

現在的問題是:當我提交表單時,我得到驗證錯誤,因爲密碼爲空。 我問你:

  1. 我是一個很好的方式做到這一點?

  2. 是否可以跳過驗證(密碼)在休眠更新, 但在插入時設置爲強制?然後更新除密碼 以外的所有字段(您會看到我評論的行 userToUpdate.setPassword(user.getPassword());)?

  3. 可以從編輯的形式可以更好地消除新的密碼字段,並在一個網頁,我只更新密碼更改 密碼?

  4. 在包含加密密碼的編輯表單中設置一個名爲'password'的隱藏字段是不是愚蠢/不安全的想法,所以它不會給我驗證錯誤?想一下,我認爲這不是一個好主意,因爲有人可以看到加密的密碼,只是看頁面的源代碼。加密密碼「清除」可能會危險/不安全?

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中的第一個應用程序,現在我正在存儲普通密碼,將來我會加密它們。

回答

1
  1. 當然!

  2. 僅當您刪除@Valid註釋。你可以做的是在控制器和調用DAO功能手動驗證實體之前刪除批註,然後設置的所有屬性:

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    validator = factory.getValidator(); 
    Set<ConstraintViolation<User>> constraintViolations = validator.validate(user); 
    
  3. 這是給你的。

  4. 是的,不這樣做:)

+0

你的意思是說創建自定義驗證器? – Amogh

+0

你的答案是完美的,我仍然只有一個問題:當一個字段驗證失敗(如空的用戶名),我不能通過錯誤出現編輯窗體...我總是使用'redirectAttrs.addFlashAttribute(「org.springframework。 validation.BindingResult.user「,result);'但是在這裏我看到錯誤在'constraintViolations' – SaganTheBest

+0

解決'import org.springframework.validation.Validator;''validator.validate(user,result); '。感謝您的支持! – SaganTheBest

0

•用戶名不爲空

可以在模型中使用@NotNull

•在DB唯一的用戶名(與上表中的唯一索引)

,而不是在插入就可以使一個AJAX調用時對錶單的用戶名現場脫身重點檢查的時間做輸入的用戶是否退出。

在更新你想不更新密碼(如果它的空白),更新領域

所有我想告訴你,首先,從域模型NotEmptyNotNull註解。我沒有在實踐中使用@NotNull和@NotEmpty驗證,您可以參考this article

您可以使用休眠dynamic-update僅更新那些已更改的屬性。通過this

你可以在編輯表單上使用密碼字段,並根據你的想法,你可以驗證,如果用戶在密碼字段中輸入的東西,然後更新是必需的其他明智的首先從DB設置對象獲取對象更新對象,然後調用休眠以更新對象。

更好的方式

要改變你的模型就像你說你想利用用戶的名字,姓氏,其他個人信息,應在Person模型和所有登錄賬號模型中的登錄帳戶相關的部分

所以你的模型變得像:

  • PERSONID
  • 姓名
  • 姓氏

登錄賬號

  • LoginAccountId
  • 用戶名
  • 密碼
  • FK_PersonID

你做出新的登記表視圖模型和更改密碼和編輯個人資料功能更新的詳細信息。

+0

定義不同的車型是不錯的主意!我也一樣。 – Amogh

+0

感謝您提供非常詳細和明確的答案。不幸的是,對於這個項目,人員細節不是很重要 – SaganTheBest