java - 如何在散列之前验证最小、最大密码长度?

标签 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 */    
}

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/

相关文章:

java - 使用hibernate保存父表时在外键中插入Null

spring - RSocket 和 Spring 不处理多个请求

java - OSGi JAR 一旦运行,是否可以要求其容器从另一个位置加载另一个 OSGi JAR?

java - 使用装饰器模式装饰 JLabel

java - 在不创建全新列表类的情况下将 Arraylist 转换为 Observable 列表?

database - 第一个 Hibernate 项目在哪里放置 addAnnotatedClass()

java - JPA/JPQL 查询和外键

java - 在使用 Spring Boot 进行集成测试期间使用测试数据填充数据库

spring - SonarQube分析问题

java - 使用 OAuth2RestTemplate 请求 HTTPS 资源