我正在使用Spring Security 4.2。我想在3次登錄失敗後阻止用戶15分鐘。要阻止用戶,請將用戶status
更改爲BLOCK
。我想在15分鐘後返回ACTIVE
。如何在spring框架中使用動態調度器?
我需要一個動態任務計劃程序,在15分鐘後運行並更改用戶status
。
重要:我不想跑法,每15分鐘,我想如果需要15分鐘後運行方法。
我該如何實現它?
我正在使用Spring Security 4.2。我想在3次登錄失敗後阻止用戶15分鐘。要阻止用戶,請將用戶status
更改爲BLOCK
。我想在15分鐘後返回ACTIVE
。如何在spring框架中使用動態調度器?
我需要一個動態任務計劃程序,在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調度器每分鐘運行,發現被封鎖14分鐘前,並設置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
}
}
}
不要忘了給你的Spring配置添加@EnableScheduling
。
你可能有這樣做的表定義。但這就是我通常的做法。
創建一個seprate表來維護失敗計數。
然後在此基礎上,您可以檢查您的服務/控制器層。
@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.
}
}
我不想每'USER_STATUS_JOB'時間更新用戶狀態,但是我想在需要時更新它。 –
只需檢查modficationDate是在當前時間前15分鐘,然後只更新它..所以它不會更新每個User_Status_Job時間。 –
或其他選項是創建DB sql事件,如果需要將執行更新。 –
我對ip阻塞有同樣的問題。這種方法有太多的開銷。 –
好吧,您可以使用本機查詢更新阻止用戶的狀態。所以你不應該得到用戶,它會更有效率。 –
如果您有針對ip阻塞的sam問題,則可以創建單獨的方法。 Spring允許爲調度程序配置線程池,您可以在不損失性能的情況下執行此操作。 –