Spring框架中如何使用动态调度器?

问题描述 投票:0回答:2

我正在使用 Spring Security 4.2。我想在 3 次登录失败后阻止用户 15 分钟。如需阻止用户,请将用户

status
更改为
BLOCK
。我想在 15 分钟后将其返回到
ACTIVE

我需要一个动态任务调度程序,在 15 分钟后运行并更改用户

status

重要提示:我不想每 15 分钟运行一次方法,我想在 15 分钟后运行一次方法如果需要的话

如何实施?

spring cron spring-scheduled
2个回答
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 配置中。


0
投票

您可能有用于执行此操作的表定义。但这就是我通常的做法。

创建一个单独的表来维护失败计数。

然后在此基础上您可以检查您的服务/控制器层。

    @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.

        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.