为什么验证不适用于编码密码

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>