Spring从@Scheduled任务调用安全方法

时间:2017-07-08 12:45:45

标签: spring spring-boot spring-security

我使用的是Spring Boot 1.5.3,Spring Security,Sping JPA,Hibernate。 我有几个存储库,我使用安全注释:

@Transactional
@PreAuthorize("isAuthenticated()")
public interface DailyCodeRepository extends PagingAndSortingRepository<DailyCode, Long> {

@Query("SELECT MAX(date) FROM DailyCode d ")
public LocalDate findLastCodeDate();

@Query("SELECT COUNT(d) FROM DailyCode d WHERE code=:code AND date>=DATE(:date)")
public long countDailyCodesByCodeGreaterThanDate(@Param("code") @RequestParam(value = "code", required = true) String code,
        @Param("date") @RequestParam(value = "untdateil", required = true) Instant date);
}

我这样的任务类调用了一个安全的方法:

@Component
@Transactional
public class DailyCodeTask {

@Value("${dailyCodes.generator.number}")
private int codesToGenerate;

@Scheduled(cron = "${task.dailyCodes}")
public void run() {
      //secured method!!
      LocalDate startDate = dailyCodeRepository.findLastCodeDate();
  }
}

现在,当任务开始时,我发现异常,因为Spring在SecurityContext中找不到身份验证。

8/07/2017 14:39:00,007 ERROR pool-3-thread-1 TaskUtils$LoggingErrorHandler:95 - Unexpected error occurred in scheduled task.
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

当然,这并不奇怪。我想知道解决这个问题的最佳做法是什么。

  1. 创建一个不需要进行身份验证的服务似乎过度使用。当我已经在存储库中准备好方法时,我已经创建了很多代码
  2. 以编程方式设置安全身份验证:似乎很好,但它是否安全?我找到了一篇旧文章here
  3. 如果选项2是最好的,我想知道使用Spring 4.3.x的最佳实践。

0 个答案:

没有答案