我们正在使用来自客户端的远程方法EJB填充映射。该应用程序正在使用计时器处理来自此映射的数据。
使用LDAP激活security-domain时,客户端可以使用LDAP身份验证调用远程方法,但是计时器超时会引发javax.ejb.EJBAccessException: Invalid User
。注释@javax.ejb.Schedule
的方法尝试调用本地EJB方法,并且身份验证失败。
我已经阅读了很多关于此配置的主题:最重要的似乎是Giving security priviliege to a scheduler in Java EE 6,但定时器上的注释@RunAs
似乎没有影响。
我尝试了jboss-app / security-domain和@org.jboss.ejb3.annotation.SecurityDomain
注释之间的不同组合但没有成功。
是否有人使用带有LDAP身份验证的计时器?
答案 0 :(得分:0)
使用 @ RunAs / @ RunAsPrincipal 时,当主体未传播时会发生此问题。
要解决此问题,您必须更改$ JBOSS_HOME/server/<instance>/deploy/ejb3-interceptors-aop.xml
添加中的配置:
<interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/>
StatelessBeanTimeoutMethodStack
中的
ejb3-interceptors-aop.xml
(约203行)看起来像:
<stack name="StatelessBeanTimeoutMethodStack">
<!-- Include the common timeout method stack
After JBAS-8130, just use this stack-ref and remove the 4 duplicate listed interceptor-refs
below
<stack-ref name="TimeoutMethodStack"/> -->
<interceptor-ref name="org.jboss.ejb3.interceptor.EJB3TCCLInterceptor"/>
<interceptor-ref name="org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor"/>
<interceptor-ref name="CurrentInvocationContextInterceptor"/>
<interceptor-ref name="org.jboss.ejb3.BlockContainerShutdownInterceptor"/>
<!-- The additional SLSB specific ones -->
<interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/>
<interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/>
<interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/>
<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"/>
</stack>
MDB发生同样的问题。