猿问

为春季计划作业添加@PreAuthorize 角色

在我的后端,我添加了@PreAuthorize("hasRole('ROLE_ADMIN') 以允许用户访问服务层中的功能。现在我想使用我的调度作业(springframework调度)来访问这些服务,但显然它可以不是。我的问题是如何添加 ROLE_ADMIN 角色或为计划作业生成用户主体?


@PreAuthorize("hasRole('ROLE_ADMIN')")

JsonNode loadSMS(String additionalPath) {

    .....

}


芜湖不芜
浏览 131回答 2
2回答

繁星淼淼

要么有另一种未用@PreAuthorize调度程序调用的方法进行注释的方法。将实现移动到这个新方法中,并改变现有loadSMS的使用这个新方法,以减少代码重复。否则你可以在运行时添加一个角色,但我认为这不是一个好主意。

达令说

你可以试试下面的代码@Serviceclass SchedulerService {    @Autowired    private YourService service;    @Scheduled(fixedRate = 600000L, initialDelay = 60000L)    public void executeTask() throws IOException {        RunAs.runAsAdmin(() -> {          service.loadSMS(String additionalPath) {        });    }}public class RunAs {    @FunctionalInterface    public interface RunAsMethod {        default void run() {            try {                runWithException();            } catch (Exception e) {            }        }        void runWithException() throws Exception;    }    public static void runAsAdmin(final RunAsMethod func) {        final AnonymousAuthenticationToken token = new AnonymousAuthenticationToken("adminUser", "adminPassword",                ImmutableList.of(new SimpleGrantedAuthority("ROLE_ADMIN")));        final Authentication originalAuthentication = SecurityContextHolder.getContext().getAuthentication();        SecurityContextHolder.getContext().setAuthentication(token);        func.run();        SecurityContextHolder.getContext().setAuthentication(originalAuthentication);    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答