Apache Shiro;用于计划用户的SecurityUtils.getSubject?

问题描述

我要实现以下方案: 我有一个EJB调度程序,它应该每1分钟运行一次。

我的问题如下: 我需要执行时间表的用户登录。这应该是系统用户。将不会通过GUI登录

如何登录用户并执行进一步的任务? 目前,我正在上课:

    @Singleton
    @LocalBean
    @Startup
    public class Scheduler {
        

public void startSchedule() {
    Subject currentUserShiro = SecurityUtils..getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken("[email protected]","test1234");
    currentUserShiro.login(token);

在我的一项职能中,我检查了获得许可:

SecurityUtils.getSubject().isPermitted("billingInvoice:create") 

我当前遇到以下问题:

没有SecurityManager可供调用代码访问,无论是绑定到org.apache.shiro.util.threadcontext还是作为vm静态单例。这是无效的应用程序配置。

有什么主意吗?


代码更新:

    private void addScheduletoList(ScheduleExecution scheduleExecution) throws UnkNownHostException {

    synchronized (this) {

        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-web.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = new Subject.Builder().buildSubject();

        Runnable myRunnable = null;

        subject.execute(myRunnable = new Runnable() {
            @Override
            public void run() {
                    // Add tasks
                    executeAction(scheduleExecution);
             }
        });

        //////
        schedulingService.addTaskToExecutor(taskId,myRunnable,0);

    }

}

我现在是gettig,不再是最初收到的问题消息,但是似乎我正在获得PermissionException,因为用户没有权限?如果我检查Subject对象,则该对象未通过身份验证。此Subject对象需要完全许可。我该怎么办?

SecurityUtils.getSubject()。isPermitted(“ billingInvoice:create”)==假

解决方法

您有两种选择。

  1. 将权限检查移至基于Web的方法,这会将权限检查移至计划任务之外。 (这并不总是可能的,并且由于您是在问这个问题,所以我假设您想要第二个选项)

  2. 您需要在用户的上下文中执行任务。使用SubjectBuilder创建一个新的Subject,然后使用您的任务中的可运行对象调用execute

具体参见https://shiro.apache.org/subject.html的“线程关联”部分。