【问题标题】:rawPassword cannot be null exceptionrawPassword 不能为空异常
【发布时间】:2021-06-30 18:27:45
【问题描述】:

我有以下问题:

我想测试用户是否注册成功。我不是通过 UI 而是通过 Postman 执行此操作。问题是当我使用 POST 命令时出现异常。我已经检查了所有注释。

Postman Screenshot

例外:

java.lang.IllegalArgumentException: rawPassword 不能为空 在 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.encode(BCryptPasswordEncoder.java:103) ~[spring-security-core-5.3.3.RELEASE.jar:5.3.3.RELEASE] 在 com.example.application.backend.data.service.UserService.singUpUser(UserService.java:41) ~[classes/:na] 在 com.example.application.backend.data.registration.RegistrationService.register(RegistrationService.java:22) ~[classes/:na] 在 com.example.application.backend.data.registration.RegistrationController.register(RegistrationController.java:18)

这是我的 UserService 类:

private final static  String USER_NOT_FOUND_MSG = "user with email %s not found";
@Autowired
private final UserRepository userRepository;
@Autowired
private final BCryptPasswordEncoder bCryptPasswordEncoder;

public UserService(
        UserRepository userRepository,
        BCryptPasswordEncoder bCryptPasswordEncoder) {
    this.userRepository = userRepository;
    this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    return userRepository.findByEmail(email)
            .orElseThrow(() ->
                    new UsernameNotFoundException(String.format(USER_NOT_FOUND_MSG, email)));
}

public String singUpUser(User user) {
    boolean userExists = userRepository.findByEmail(user.getEmail()).isPresent();

    if(userExists){
        throw new IllegalStateException("email already taken");
    }

    String encodedPassword = bCryptPasswordEncoder.encode(user.getPassword());

    user.setPassword(encodedPassword);

    userRepository.save(user);

    return "it works";
}

注册服务类:

@Autowired
private final UserService userService;
private final EmailValidator emailValidator;

public String register(RegistrationRequest request) {
    boolean isValidEmail = emailValidator.test(request.getEmail());
    if (!isValidEmail) {
        throw new IllegalStateException("email not valid");
    }
    return userService.singUpUser(
            new User(
                    request.getFirstName(),
                    request.getLastName(),
                    request.getEmail(),
                    request.getPassword(),
                    UserRole.USER
            )
    );
}

public RegistrationService(UserService userService, EmailValidator emailValidator) {
    this.userService = userService;
    this.emailValidator = emailValidator;
}

注册控制器类:

@Autowired
private RegistrationService registrationService;

@PostMapping
public String register(@RequestBody RegistrationRequest request) {
    return registrationService.register(request);
}

【问题讨论】:

    标签: java spring security passwords bcrypt


    【解决方案1】:

    它正在工作。问题是 @Column 注释被设置为 nullable false。

    【讨论】:

      【解决方案2】:

      当提供给 bCryptEncoder 的密码字符串为空或 null 时,会发生此错误。

      在您的 UserService.java 类中,

      String encodedPassword = bCryptPasswordEncoder.encode(user.getPassword());
      

      user.getPassword() 为 null,表示在 RegistrationService.java 类中,

      request.getPassword()
      

      正在获取一个空值。

      请检查您是否从请求对象中获取了正确的密码参数名称。如果可能,请在您的代码中添加一些记录器语句并进行调试。

      GitHub PR

      【讨论】:

      • 感谢您的回答。我调试我的代码并删除了用户类中的空构造函数。 getter 不再为空,但我有另一个例外:非空属性引用空值或瞬态值:com.example.application.backend.data.entity.User.department
      猜你喜欢
      • 2021-06-16
      • 2022-01-05
      • 2021-04-18
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多