Как проверить минимальную, максимальную длину пароля перед хэшированием? - PullRequest
3 голосов
/ 15 января 2020

Я хочу проверить длину поля пароля перед его хэшированием.

Класс модели:

@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 ]

3 голосов
/ 15 января 2020

Вы можете проверить ввод любого 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;

Чтобы это работало, вам нужно spring-boot-starter-validation в вашем файле конфигурации Maven / Gradle.

1 голос
/ 15 января 2020

Вы можете использовать @Valid.

@RestController
public class UserController {

    @PostMapping("/users")
    ResponseEntity<String> register(@Valid @RequestBody User user) {
        userService.register(user);
    }

}

Когда Spring Boot находит аргумент, аннотированный @Valid, он автоматически запускает реализацию JSR 380 по умолчанию - Hibernate Validator - и проверяет аргумент.

Если целевой аргумент не проходит проверку, 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;
}

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...