我正在使用 Spring Security 4.2。我想在 3 次登录失败后阻止用户 15 分钟。如需阻止用户,请将用户
status
更改为 BLOCK
。我想在 15 分钟后将其返回到ACTIVE
。
我需要一个动态任务调度程序,在 15 分钟后运行并更改用户
status
。
重要提示:我不想每 15 分钟运行一次方法,我想在 15 分钟后运行一次方法如果需要的话。
如何实施?
我有一些方法。我想你应该使用
User
类,如下所示:
class User {
// ...
private Status status;
private LocalDateTime lastUpdated;
// ...
}
因此,您应该在用户阻止期间更新
status
和 lastUpdated
字段。
@Service
public class UserService {
private UserRepository userRepository;
@Transactional
public void block(User user) {
user.setStatus(Status.BLOCKED);
user.setLastUpdated(LocalDateTime.now());
userRepository.save(user);
}
}
之后,您可以使用 Spring Scheduler,它每分钟运行一次,查找 15 分钟前被阻止的用户,并将
status
设置为 ACTIVE
。
@Component
public class UserActivator {
private boolean activateUsers = false;
@Scheduled("0 * * * * *")
public void activateUsers() {
if (activateUsers) {
// find users that were deactivated 15 minutes ago and change status to active
}
}
}
不要忘记将
@EnableScheduling
添加到您的 Spring 配置中。
您可能有用于执行此操作的表定义。但这就是我通常的做法。
创建一个单独的表来维护失败计数。
然后在此基础上您可以检查您的服务/控制器层。
@Controller
public Class LoginController{
@Autowired
private UserLoginFailureRepository userLoginFailureRepository;
@Autowired
private UserRepostory userRepository;
@Transactional
public void login(){
UserLoginFailure loginFailure = userLoginFailureRepository.getUserLoginfailureDetails(username);
if (loginFailure != null) {
loginFailure.setFailureCount(1l + loginFailure.getFailureCount());
if (loginFailure.getFailureCount() > loginFailureCount) {
// block the user.
User user = userRepository.getUser(username);
user.setStatus(BLOCK);
user.setModificationDate(LocalDateTime.now());
}
}
}
}
创建单独的计划作业来检查和更新用户状态并重置 UserLoginFailure 计数。
@Component
public class userPasswordResetJob{
@Autowired
private UserLoginFailureRepository userLoginFailureRepository;
@Autowired
private UserRepostory userRepository;
@Scheduled(cron = "${USER_STATUS_JOB}")
public void loginDay() throws Exception{
// Have your logic to update the User status and reset the failure count.
}
}