在使用quartz-ra.rar将应用程序从QuartzMDB迁移到Jboss AS 6.1中的EJB Timers之后,我遇到了上述异常。 (作为将应用程序升级到wildfly 8.1的一部分)
使用以下ejb的作业发生异常。
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@RolesAllowed({"admin"})
public class PlatformPluginBean implements PlatformPluginRemote {
// some code here
public Collection<PlatformPlugin> getPlugins() {
return new ArrayList<PlatformPlugin>(schemaToPlugin.values());
}
}
以下是迁移前的工作,工作正常。
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "cronTrigger", propertyValue = "0 0 * * * ?"),
@ActivationConfigProperty(propertyName = "jobName", propertyValue = "PruneJob")})
@ResourceAdapter("quartz-ra.rar")
@RunAs("admin")
public class PruneJob implements Job {
@EJB
private PlatformPluginRemote platformPluginRemote;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
for (PlatformPlugin platformPlugin: platformPluginRemote.getPlugins()) {
// some stuff here
}
}
}
以下是更改为ejb自动计时器后的作业。
@Stateless
@RunAs("admin")
public class PruneJob {
@EJB
private PlatformPluginRemote platformPluginRemote;
@Schedule(hour="*", minute="0", persistent=false)
public void execute() {
for (PlatformPlugin platformPlugin: platformPluginRemote.getPlugins()) {
// some stuff here
}
}
}
platformPluginRemote.getPlugins()
来电时发生异常。
答案 0 :(得分:0)
在JBoss 5中报告了这个issue,它也影响jboss为6.1,修复它你可以在文件JBOSS_HOME/serve/<instance>/deploy/ejb3-interceptors-aop.xml
中添加org.jboss.ejb3.security.RunAsSecurityInterceptorFactory
拦截器:
例如:
<! - The additional MDB specific ones ->
<interceptor-ref name = "org.jboss.ejb3.ENCPropagationInterceptor" />
<interceptor-ref name = "org.jboss.ejb3.security.RunAsSecurityInterceptorFactory" />
<interceptor-ref name = "CMTTx" />
<interceptor-ref name = "org.jboss.ejb3.stateless.StatelessInstanceInterceptor" />
<interceptor-ref name = "org.jboss.ejb3.tx.BMTTxInterceptorFactory" />
<interceptor-ref name = "org.jboss.ejb3.AllowedOperationsInterceptor" />
<interceptor-ref name = "org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor" />
在实践中,它向我提出了一些问题,而不是所有调用角色都被传播,有时会发生授权错误。
或者,您可以在MDB的Subject.doAs()
方法中使用execute()
。不要忘记在安全域中添加登录模块ClientLoginModule。
答案 1 :(得分:0)
@RunAs("admin")
注释似乎不是出于某种原因(jboss bug?)
可以通过在调用ejb之前添加以下代码来完成相同的操作。
SecurityContextAssociation.getSecurityContext().setOutgoingRunAs(new RunAsIdentity("admin", "admin"));