我正在使用Spring Security 4.2。我想在3次登录失败后阻止用户15分钟。要阻止用户,请将用户status
更改为BLOCK
。我希望在15分钟后将其返回ACTIVE
。
我需要一个在15分钟后运行的动态任务调度程序,并更改用户status
。
重要提示:我不想每15分钟运行一次方法,我想在15分钟后运行方法如果需要。
如何实施?
答案 0 :(得分:1)
我有一些方法。我想您应该使用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配置中。
答案 1 :(得分:0)
你可能有表格定义这样做。但这就是我一般的做法。
创建一个单独的表来维护失败计数。
然后在此基础上,您可以检查您的服务/控制器层。
SELECT A,B FROM myTable WHERE C='f' GROUP BY A,B
创建一个单独的预定作业来检查和更新用户状态并重置UserLoginFailure计数。
@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());
}
}
}
}