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操作。你需要根据数据库的类型和框架的要求来实现该接口。
需要注意的是,上述代码只是一个示例,你需要根据具体的业务需求进行调整并进行单元测试。
【相关推荐】