我想在散列之前验证密码字段的长度。
模型类:
@Entity
@Table(name = "users")
public class UserInfo {
/* other code */
@NotBlank(message = "Password is required")
@Size(min = 6, message = "Password should have min 6 characters")
private String password;
/* other code */
}
Controller 文件只是调用服务方法。
服务等级:
@Component
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoRepository userInfoRepository;
public UserInfo register(UserRegisterRequest request) {
UserInfo user = new UserInfo();
user.setFirstName(request.getFirstName());
user.setLastName(request.getLastName());
user.setEmail(request.getEmail());
user.setPhone(request.getPhone());
// Password hashing
user.setPassword(new BCryptPasswordEncoder().encode(request.getPassword()));
user.setIsActive(0);
user.setStatus(1);
return userInfoRepository.save(user);
}
}
我想密码在这一行中被散列后得到验证:
user.setPassword(new BCryptPasswordEncoder().encode(request.getPassword()));
如何在散列和保存之前验证此密码?
如有任何帮助,我们将不胜感激。提前致谢。
最佳答案
您可以验证任何 Spring bean 的输入。为此,您可以组合使用 @Validated 和 @Valid 注释,如下所示:
@Component
@Validated
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoRepository userInfoRepository;
public UserInfo register(@Valid UserRegisterRequest request) {
UserInfo user = new UserInfo();
user.setFirstName(request.getFirstName());
user.setLastName(request.getLastName());
user.setEmail(request.getEmail());
user.setPhone(request.getPhone());
// Password hashing
user.setPassword(new BCryptPasswordEncoder().encode(request.getPassword()));
user.setIsActive(0);
user.setStatus(1);
return userInfoRepository.save(user);
}
}
如果你想要更好的控制,你可以通过编程方式验证:
@Component
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoRepository userInfoRepository;
public UserInfo register(UserRegisterRequest request) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<UserRegisterRequest> violations = validator.validate(input);
if (!violations.isEmpty()) {
// Do something on invalid input;
}
UserInfo user = new UserInfo();
user.setFirstName(request.getFirstName());
user.setLastName(request.getLastName());
user.setEmail(request.getEmail());
user.setPhone(request.getPhone());
// Password hashing
user.setPassword(new BCryptPasswordEncoder().encode(request.getPassword()));
user.setIsActive(0);
user.setStatus(1);
return userInfoRepository.save(user);
}
}
或者,可以像这样注入(inject)一个预先配置的 validator 实例:
@Autowired
Validator validator;
要使这些正常工作,您需要在 Maven/Gradle 配置文件中添加 spring-boot-starter-validation
。
关于java - 如何在散列之前验证最小、最大密码长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59745545/