2017-07-05 32 views
0

我正在使用Spring Security 4.2。我想在3次登錄失敗後阻止用戶15分鐘。要阻止用戶,請將用戶status更改爲BLOCK。我想在15分鐘後返回ACTIVE如何在spring框架中使用動態調度器?

我需要一個動態任務計劃程序,在15分鐘後運行並更改用戶status

重要:我不想跑法,每15分鐘,我想如果需要15分鐘後運行方法。

我該如何實現它?

回答

1

我有一些辦法。我想,你應該使用User類像以下:

class User { 
    // ... 
    private Status status; 
    private LocalDateTime lastUpdated; 
    // ... 
} 

所以,你應該在用戶阻塞時更新statuslastUpdated領域。

@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分鐘前,並設置statusACTIVE用戶。

@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

+0

我對ip阻塞有同樣的問題。這種方法有太多的開銷。 –

+0

好吧,您可以使用本機查詢更新阻止用戶的狀態。所以你不應該得到用戶,它會更有效率。 –

+0

如果您有針對ip阻塞的sam問題,則可以創建單獨的方法。 Spring允許爲調度程序配置線程池,您可以在不損失性能的情況下執行此操作。 –

0

你可能有這樣做的表定義。但這就是我通常的做法。

創建一個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. 

     } 
    } 
+0

我不想每'USER_STATUS_JOB'時間更新用戶狀態,但是我想在需要時更新它。 –

+0

只需檢查modficationDate是在當前時間前15分鐘,然後只更新它..所以它不會更新每個User_Status_Job時間。 –

+0

或其他選項是創建DB sql事件,如果需要將執行更新。 –

相關問題