Ограничение длины пароля в Spring Security

266
31 января 2018, 13:44

Делаю регистрацию юзера. Длина пароля должна быть от 6 до 16 символов. Сначала думал воспользоваться аннотацией @Size(min = 6, max = 16) в энтити, но потом выяснил, что после шифрования пароля BCryptPasswordEncoder именно зашифрованную часть проверяет @Size, а это 60 символов. Как мне реализовать эту функцию? Думал сделать через сервис, но как по мне это хардкод, уверен есть решение лучше.

SellerController:

@RestController
@RequestMapping("/api")
public class SellerController {
  @Autowired
  SellerServiceImpl sellerService;
  @RequestMapping(value = "/seller-registration", method = RequestMethod.POST)
  public ResponseEntity<String> sellerRegistration(@Valid @RequestBody Seller newSeller) {
    Seller seller = sellerService.save(newSeller);
    return ResponseEntity.status(HttpStatus.CREATED).build();
  }
}

Seller:

@Entity
@Table(name = "users")
public class Seller {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  @Column(name = "username", unique = true)
  @NotNull(message = "username can not be null.")
  private String username;
  @Column(name = "password")
  @NotNull(message = "password can not be null.")
  //@Size(min = 6, max = 15)
  private String password;
  @ManyToMany
  @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"),
      inverseJoinColumns = @JoinColumn(name = "role_id"))
  private Set<Role> roles;
  @Column(name = "email", unique = true)
  @NotNull(message = "email can not be null.")
  @Email
  private String email;

SellerServiceImpl:

@Service
public class SellerServiceImpl {
  @Autowired
  SellerRepository sellerRepository;
  @Autowired
  RoleRepository roleRepository;
  @Autowired
  PasswordEncoder passwordEncoder;
  public SellerServiceImpl() {
  }
  public SellerServiceImpl(SellerRepository sellerRepository, RoleRepository roleRepository,
      PasswordEncoder passwordEncoder) {
    this.sellerRepository = sellerRepository;
    this.roleRepository = roleRepository;
    this.passwordEncoder = passwordEncoder;
  }
  public Seller save(Seller seller) {
    seller.setPassword(passwordEncoder.encode(seller.getPassword()));
    Set<Role> roles = new HashSet<>();
    roles.add(roleRepository.findOne(2L));
    seller.setRoles(roles);
    return sellerRepository.save(seller);
  }
}
Answer 1

Лично я делал валидацию пароля средствами Validator. То есть создавал реализацию интерфейса, в методе писал регулярку для пароля.

А затем использовал метод в контроллере.

READ ALSO
Как сделать подпись у иконки в floating action button?

Как сделать подпись у иконки в floating action button?

У меня есть Floating Action Button с Vector Drawable внутриМожно ли под него вставить текст? (не рядом с кнопкой, а внутри нее, как на картинке)

211
Как определить причину исключения

Как определить причину исключения

Помогите, пожалуйста, определить причину исключенияУстанавливаю приложение на Centos7, которое работает с MySql

256
Placemark с button yandex

Placemark с button yandex

Подскажите пожалуйста как сделать такое: Открываешь Placemark в нем кнопка выбрать, после ее нажатия на странице нужно перезаписать значение...

492
jquery как из кода элемента сделать jquery формат

jquery как из кода элемента сделать jquery формат

Получаю все элементы класса

236