java登录功能。登录成功签发token,密码1分钟内错误超过3次,则锁定账号1小时(10分)

java登录功能。登录成功签发token,密码1分钟内错误超过3次,则锁定账号1小时(springcloud)

登录接口做拦截,Redis做实时缓存计数器,就可以实现

【以下回答由 GPT 生成】

首先,我们需要设计一个数据库表来存储用户信息和登录记录。建议使用MySQL数据库,创建一个名为User的表,包含以下字段: - id:用户ID(主键) - username:用户名 - password:密码 - token:签发的token - login_attempts:登录失败次数 - last_failed_login_time:最后一次登录失败的时间 - is_locked:账号是否被锁定

接下来,我们需要设计一个用户登录接口,在用户输入用户名和密码后进行验证。

@RestController
public class LoginController {

    @Autowired
    private UserRepository userRepository;

    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {
        User user = userRepository.findByUsername(username);

        if (user == null) {
            return ResponseEntity.badRequest().body("Invalid username");
        }

        if (!user.getPassword().equals(password)) {
            updateFailedLoginInfo(user);
            return ResponseEntity.badRequest().body("Invalid password");
        }

        if (user.isLocked()) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Account is locked");
        }

        String token = generateToken(user);

        // 更新用户登录信息
        user.setToken(token);
        user.setLoginAttempts(0);
        user.setLastFailedLoginTime(null);
        userRepository.save(user);

        return ResponseEntity.ok(token);
    }

    private void updateFailedLoginInfo(User user) {
        LocalDateTime currentDateTime = LocalDateTime.now();

        int loginAttempts = user.getLoginAttempts();
        LocalDateTime lastFailedLoginTime = user.getLastFailedLoginTime();

        // 如果最后一次登录失败时间超过1分钟,则重置登录失败次数
        if (lastFailedLoginTime != null && lastFailedLoginTime.plusMinutes(1).isBefore(currentDateTime)) {
            user.setLoginAttempts(0);
        }

        // 更新登录失败次数和最后一次登录失败时间
        user.setLoginAttempts(loginAttempts + 1);
        user.setLastFailedLoginTime(currentDateTime);

        // 如果登录失败次数达到3次,并且在1分钟内,则锁定账号
        if (user.getLoginAttempts() >= 3 && lastFailedLoginTime.plusMinutes(1).isAfter(currentDateTime)) {
            user.setLocked(true);
        }

        userRepository.save(user);
    }

    private String generateToken(User user) {
        // 根据用户信息生成token,可以使用JWT来实现

        return token;
    }
}

在上述代码中,我们首先通过username从数据库中获取用户信息。如果用户不存在,则返回错误信息。然后比较用户输入的密码和数据库中存储的密码,如果不匹配,则更新登录失败信息,并返回错误信息。

如果密码验证通过,我们还需要检查该用户是否已被锁定。如果是,则返回账号被锁定的错误信息。

如果密码验证通过且账号未被锁定,我们生成一个token,并将其存储到数据库中。然后,将token返回给用户。

在登录失败的情况下,我们会更新用户的登录失败次数和最后一次登录失败的时间。如果登录失败次数达到3次,并且在1分钟内,则锁定账号。

上述代码中的UserRepository是一个自定义的接口,用于操作用户数据表的CRUD操作。你需要根据数据库的类型和框架的要求来实现该接口。

需要注意的是,上述代码只是一个示例,你需要根据具体的业务需求进行调整并进行单元测试。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^