我想先验证密码字段的长度,然后再对其进行哈希处理。
模型类:
@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 */
}
控制器文件只是调用服务方法。
服务等级:
@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()));
如何在哈希和保存之前验证此密码?
任何帮助将不胜感激。预先感谢。
答案 0 :(得分:2)
您可以验证 any 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);
}
}
或者,可以像这样注入预先配置的验证器实例:
@Autowired
Validator validator;
要使它们起作用,您需要在Maven / Gradle配置文件中使用spring-boot-starter-validation
。
答案 1 :(得分:1)
您可以使用@Valid
。
@RestController
public class UserController {
@PostMapping("/users")
ResponseEntity<String> register(@Valid @RequestBody User user) {
userService.register(user);
}
}
当Spring Boot找到带有@Valid注释的参数时,它将自动引导默认的JSR 380实现—休眠验证器—并验证该参数。
当目标参数未能通过验证时,Spring Boot会引发MethodArgumentNotValidException异常。
您可以使用@ExceptionHandler处理和自定义消息
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(
MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}