为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2022-07-14 09:31:03
在我的后端,我添加了@PreAuthorize("hasRole('ROLE_ADMIN') 以允许用户访问服务层中的功能。现在我想使用我的调度作业(springframework调度)来访问这些服务,但显然它可以不是。我的问题是如何添加 ROLE_ADMIN 角色或为计划作业生成用户主体?@PreAuthorize("hasRole('ROLE_ADMIN')")JsonNode loadSMS(String additionalPath) {    .....}
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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



查看完整回答
反对 回复 2022-07-14
?
达令说

TA贡献1821条经验 获得超6个赞

你可以试试下面的代码


@Service

class 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);

    }

}


查看完整回答
反对 回复 2022-07-14
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信