我有一個管理面板,我可以添加用戶。 在插入表單我有用戶名,密碼(沒有確認密碼),以及一些普通的領域,如姓名,....春天+休眠更新密碼
當我插入一個新的用戶,我想,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領域是一個普通的標籤,而無需使用彈簧符號。我將在控制器中檢索這個參數,我將檢查是否寫入了新密碼或者不是。
現在的問題是:當我提交表單時,我得到驗證錯誤,因爲密碼爲空。 我問你:
我是一個很好的方式做到這一點?
是否可以跳過驗證(密碼)在休眠更新, 但在插入時設置爲強制?然後更新除密碼 以外的所有字段(您會看到我評論的行
userToUpdate.setPassword(user.getPassword());
)?可以從編輯的形式可以更好地消除新的密碼字段,並在一個網頁,我只更新密碼更改 密碼?
在包含加密密碼的編輯表單中設置一個名爲'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中的第一個應用程序,現在我正在存儲普通密碼,將來我會加密它們。
你的意思是說創建自定義驗證器? – Amogh
你的答案是完美的,我仍然只有一個問題:當一個字段驗證失敗(如空的用戶名),我不能通過錯誤出現編輯窗體...我總是使用'redirectAttrs.addFlashAttribute(「org.springframework。 validation.BindingResult.user「,result);'但是在這裏我看到錯誤在'constraintViolations' – SaganTheBest
解決'import org.springframework.validation.Validator;''validator.validate(user,result); '。感謝您的支持! – SaganTheBest