对现有&;具有Spring安全性的不存在用户

对现有&;具有Spring安全性的不存在用户,spring,spring-security,redis,bcrypt,Spring,Spring Security,Redis,Bcrypt,在我的身份验证服务中,我试图使用一个简单的StringRedisTemplate对象从我的Redis获取密码。 然后,我使用BCryptPasswordEncoder进行密码匹配。 我发现用户名不匹配和密码不匹配之间存在时间差。 我读过一些文章说用户名不是一个秘密值,我不必担心——我知道这一点,但就我而言,我希望两种情况之间没有时间差。 我该怎么做 @PostMapping(value = "/auth", consumes = "application/json") public Respon

在我的身份验证服务中,我试图使用一个简单的
StringRedisTemplate
对象从我的Redis获取密码。
然后,我使用
BCryptPasswordEncoder
进行密码匹配。
我发现用户名不匹配和密码不匹配之间存在时间差。
我读过一些文章说用户名不是一个秘密值,我不必担心——我知道这一点,但就我而言,我希望两种情况之间没有时间差。
我该怎么做

@PostMapping(value = "/auth", consumes = "application/json")
public ResponseEntity<?> isClientExists(@Valid @RequestBody User user) {
    //with redisTemplate.opsForValue().get(sha256Hex(userName)) :
    UserDetails user = redisClient.loadUserByUserName(user.getUserName()); 

    if (userNotFound(userFromDB)) {
        /* What should I add here to make it time-invariant query? */
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    }
    if (!authenticateUser(user.getPassword(), userFromDB.getPassword())) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    }

    return ResponseEntity.status(HttpStatus.OK).build();
}

private boolean userNotFound(UserDetails userFromDB) {
    return (userFromDB == null);
}

private boolean authenticateUser(String userPassword, String userFromDBPassword) {
    //with BCryptPasswordEncoder :
    return passwordEncoder.matches(userPassword, userFromDBPassword);
}
@PostMapping(value=“/auth”,consumes=“application/json”)
公共响应权限是客户端列表(@Valid@RequestBody User){
//使用redisTemplate.opsForValue().get(sha256Hex(用户名)):
UserDetails user=redisClient.loadUserByUserName(user.getUserName());
if(userNotFound(userFromDB)){
/*我应该在这里添加什么使其成为时不变查询*/
返回ResponseEntity.status(HttpStatus.UNAUTHORIZED.build();
}
如果(!authenticateUser(user.getPassword(),userFromDB.getPassword())){
返回ResponseEntity.status(HttpStatus.UNAUTHORIZED.build();
}
返回ResponseEntity.status(HttpStatus.OK).build();
}
私有布尔userNotFound(UserDetails userFromDB){
返回(userFromDB==null);
}
私有布尔认证器(String userPassword、String userFromDBPassword){
//使用BCryptPasswordEncoder:
返回passwordEncoder.matches(userPassword,userFromDBPassword);
}
两种方法:

1) 计算authenticateUser调用平均需要多长时间,并睡眠这么长时间(尽管时间在将来CPU升级时可能会改变)


2) 只需使用随机数据进行另一次AuthenticateSer调用,并忽略结果。

为什么要自己实现登录?SpringSecurity已经做到了。不要绕过Spring安全性。然而,加载用户的时间取决于数据库,并且对于所有用户名都应该相等。