我使用的是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
当然,这并不奇怪。我想知道解决这个问题的最佳做法是什么。
如果选项2是最好的,我想知道使用Spring 4.3.x的最佳实践。