问题描述
我要实现以下方案: 我有一个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”)==假
解决方法
您有两种选择。
-
将权限检查移至基于Web的方法,这会将权限检查移至计划任务之外。 (这并不总是可能的,并且由于您是在问这个问题,所以我假设您想要第二个选项)
-
您需要在用户的上下文中执行任务。使用SubjectBuilder创建一个新的Subject,然后使用您的任务中的可运行对象调用
execute
。
具体参见https://shiro.apache.org/subject.html的“线程关联”部分。