为什么验证不适用于编码密码
Why validation not work for encoded password
在我的项目中,我为注册表单字段添加了一些验证。虽然单击提交按钮密码验证不会检查 @AAAzzz123
之类的原始密码,但它会检查 a$kUm6AxxH3SNSIoUtP6V7WOlFTIORTOILKDFGOP
之类的编码密码并产生验证错误消息。下面是我的代码。
实体
public class User {
...
...
...
@Pattern(regexp = "(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,15}$")
private String password;
}
控制器
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String resiterUser(@Valid @ModelAttribute("user") User user,
BindingResult result)
{
if(result.hasErrors())
{
return "signup";
}
// Problem is here
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepo.save(user);
return "redirect:/";
}
查看
<form th:action="@{/register}" method="post">
<div class="form-outline mb-4">
<label class="form-label" for="form3Example4cg">Password</label>
<input type="password"
th:classappend="${#fields.hasErrors('password') ? 'is-invalid' : ''}"
class="form-control form-control-lg"
name="password" />
<div id="validation" class="text-danger" th:each="e: ${#fields.errors('password')}" th:text=${e}>
</div>
</div>
<div class="d-flex">
<button type="submit" class="btn bg-primary">Submit</button>
</div>
</form>
验证分为两个阶段 - MVC 层和 JPA 层。如果您对两个层使用相同的模型 class,那么您不能对两个不同的事物使用相同的字段。
你可以这样分开,例如:
@Entity
@Table(name = "USER")
public class User {
@Column(name = "password")
@Pattern(regexp = "^\[aby]\$.{56}$")
private String encodedPassword
// for form binding only
private transient String newPassword;
}
user.setEncodedPassword(bCryptPasswordEncoder.encode(user.getNewPassword()));
我在@OrangeDog
的帮助下解决了我的问题,谁能告诉我如何解决这个问题。
- 用
transient
关键字声明另一个变量dummyPassword
,它是临时变量。
- 我在这里尝试验证用户在 Controller 中输入的密码,如果正则表达式匹配,
dummyPassword
进入编码密码并保存到数据库中,否则会出现验证错误
实体:
public class User {
...
...
...
private String password;
@Pattern(regexp = "(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,15}$")
private transient String dummyPassword;
}
在 Controller 中将 dummyPassword 设置为原始密码
user.setPassword(bCryptPasswordEncoder.encode(user.getDummyPassword()));
百里香
<div class="form-outline mb-4">
<label class="form-label" for="form3Example4cg">Password</label>
<input type="password"
id="form3Example4cg"
th:classappend="${#fields.hasErrors('newPassword') ? 'is-invalid' : ''}"
class="form-control form-control-lg"
name="newPassword" />
<div class="text-danger" th:each="e: ${#fields.errors('newPassword')}" th:text=${e}>
</div>
</div>
在我的项目中,我为注册表单字段添加了一些验证。虽然单击提交按钮密码验证不会检查 @AAAzzz123
之类的原始密码,但它会检查 a$kUm6AxxH3SNSIoUtP6V7WOlFTIORTOILKDFGOP
之类的编码密码并产生验证错误消息。下面是我的代码。
实体
public class User {
...
...
...
@Pattern(regexp = "(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,15}$")
private String password;
}
控制器
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String resiterUser(@Valid @ModelAttribute("user") User user,
BindingResult result)
{
if(result.hasErrors())
{
return "signup";
}
// Problem is here
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepo.save(user);
return "redirect:/";
}
查看
<form th:action="@{/register}" method="post">
<div class="form-outline mb-4">
<label class="form-label" for="form3Example4cg">Password</label>
<input type="password"
th:classappend="${#fields.hasErrors('password') ? 'is-invalid' : ''}"
class="form-control form-control-lg"
name="password" />
<div id="validation" class="text-danger" th:each="e: ${#fields.errors('password')}" th:text=${e}>
</div>
</div>
<div class="d-flex">
<button type="submit" class="btn bg-primary">Submit</button>
</div>
</form>
验证分为两个阶段 - MVC 层和 JPA 层。如果您对两个层使用相同的模型 class,那么您不能对两个不同的事物使用相同的字段。
你可以这样分开,例如:
@Entity
@Table(name = "USER")
public class User {
@Column(name = "password")
@Pattern(regexp = "^\[aby]\$.{56}$")
private String encodedPassword
// for form binding only
private transient String newPassword;
}
user.setEncodedPassword(bCryptPasswordEncoder.encode(user.getNewPassword()));
我在@OrangeDog
的帮助下解决了我的问题,谁能告诉我如何解决这个问题。
- 用
transient
关键字声明另一个变量dummyPassword
,它是临时变量。 - 我在这里尝试验证用户在 Controller 中输入的密码,如果正则表达式匹配,
dummyPassword
进入编码密码并保存到数据库中,否则会出现验证错误
实体:
public class User {
...
...
...
private String password;
@Pattern(regexp = "(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,15}$")
private transient String dummyPassword;
}
在 Controller 中将 dummyPassword 设置为原始密码
user.setPassword(bCryptPasswordEncoder.encode(user.getDummyPassword()));
百里香
<div class="form-outline mb-4">
<label class="form-label" for="form3Example4cg">Password</label>
<input type="password"
id="form3Example4cg"
th:classappend="${#fields.hasErrors('newPassword') ? 'is-invalid' : ''}"
class="form-control form-control-lg"
name="newPassword" />
<div class="text-danger" th:each="e: ${#fields.errors('newPassword')}" th:text=${e}>
</div>
</div>