gpt4 book ai didi

java - 当 @Scheduled 触发时,在 SecurityContext 中未找到 Authentication 对象?

转载 作者:行者123 更新时间:2023-12-01 19:34:06 24 4
gpt4 key购买 nike

我创建了一个 Spring Boot 应用程序,但在处理某些可以手动触发或通过 @Scheduled 注释触发的端点时遇到了问题。

我遇到的问题如下:

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

如果通过@Scheduled调用进程,是否有办法触发SecurityContext

我是 Spring Security 的新手,我很难理解引用指南。我发现了一些类似的问题,但仍然无法理解如何将答案应用于我的案例。

我的MyController示例:

@Secured("ROLE_ADMIN")
@RestController
@RequestMapping(value = "/api")
public class MyController {

@Scheduled(cron = "* * * * * *")
@GetMapping(path="/data")
public void getData() {
// Do some operations
}
}

最佳答案

基本上,您必须使用必要的身份验证来配置您的调度程序。大致如下:

import com.google.common.collect.ImmutableList;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.concurrent.DelegatingSecurityContextScheduledExecutorService;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContext;

import java.util.List;
import java.util.concurrent.Executor;

import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
import static org.springframework.security.core.context.SecurityContextHolder.getContext;

@Configuration
public class SchedulerConfiguration implements SchedulingConfigurer {

private static final String KEY = "spring";
private static final String PRINCIPAL = "spring";
private static final List<SimpleGrantedAuthority> AUTHORITIES = ImmutableList.of(new SimpleGrantedAuthority("ADMIN"));

@Override
public void configureTasks(final ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}

@Bean
public Executor taskExecutor() {
final AnonymousAuthenticationToken token = new AnonymousAuthenticationToken(KEY, PRINCIPAL, AUTHORITIES);
final SecurityContext securityContext = getContext();
securityContext.setAuthentication(token);
return new DelegatingSecurityContextScheduledExecutorService(newSingleThreadScheduledExecutor(), securityContext);
}
}

然后您可以使用 @Secured("hasAuthority('ADMIN')") 注释您的 Controller

关于java - 当 @Scheduled 触发时,在 SecurityContext 中未找到 Authentication 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58467537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com