如何在散列前验证最小,最大密码长度?

时间:2020-01-15 05:23:18

标签: java hibernate spring-boot

我想先验证密码字段的长度,然后再对其进行哈希处理。

模型类:

@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()));

如何在哈希和保存之前验证此密码?

任何帮助将不胜感激。预先感谢。

2 个答案:

答案 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;
}

Reference