首页 > 解决方案 > Wildfly ContextService 并发 securityIdentity 为空

问题描述

我正在尝试通过队列发送对象。该对象被包装在 ContextService 的 createContextualProxy 中。但如果我打开对象,securityIdentity 为空。该对象是正确的代理。

发件人:

@Resource(name = "DefaultContextService")
private ContextService cs;

public void sendMessage() {
    ObjectMessage objectMessage = context.createObjectMessage();
    objectMessage.setObject((Serializable) cs.createContextualProxy(<ObjectToSend>, 
            Runnable.class));            
    context.createProducer().send(queue, objectMessage);
}

接收者:

ObjectMessage message = (ObjectMessage) msg;                
Runnable myObject = (Runnable) message.getObject();
myObject.run();

可运行的 myObject 是一个代理。但是securityIdentity=null。

以前有人遇到过这个问题吗?

标签: javajakarta-eeconcurrencyqueuewildfly

解决方案


这样做的唯一方法是将用户的安全身份直接合并到您发送的对象中。

安全上下文信息不会保留在上下文代理中,因为 WildFly(最高 15.0.1)已损坏。

JMS 要求 ObjectMessage 有效负载是可序列化的。然而,代理中保留的安全身份对象(一个org.wildfly.security.auth.server.SecurityIdentity对象)不是可序列化的,因此它transientorg.jboss.as.ee.concurrent.IdentityAwareProxyInvocationHandler代理实现中声明。

因此,它无法在后续的 JMS 消息序列化/反序列化过程中继续存在。

有一个旧的WildFly 问题已关闭,但我知道从那时起安全实施已被完全替换......


推荐阅读