2015-01-21 30 views
0

在QuartzMDB中使用quartz-ra.rar将应用程序迁移到Jboss AS 6.1中的EJB定时器后,我遇到了上述异常。 (作为将应用程序升级到wildfly 8.1的一部分)javax.ejb.EJBAccessException:调用者未经授权

在使用以下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

@RunAs("admin")注释似乎并没有出于某种原因(JBoss的错误?)

同样可以通过调用EJB之前添加以下代码来完成。

SecurityContextAssociation.getSecurityContext().setOutgoingRunAs(new RunAsIdentity("admin", "admin")); 
0

有此issue到JBoss 5日报道这也影响到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" /> 

在实践中,提出了我一些问题,而不是所有的角色被传播的调用以及一些授权错误发生。

或者,您可以使用中的Subject.doAs()方法。不要忘记在安全域中添加登录模块ClientLoginModule。

+0

感谢您的信息,但我想这对**作为JBoss 6.1不是7.2 ** – 2015-01-22 03:49:55

+0

@KosalaAlmeda是的,你说得对,是这个问题的解释的错误。再次看到我的答案。 – 2015-01-22 16:08:51

相关问题