Wildfly ContextService одновременная защита Identity является нулевым
Я пытаюсь отправить объект через очередь. Объект обернут в createContextualProxy ContextService. Но если я разверну объект, то 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.
У кого-нибудь была эта проблема раньше?
1 ответ
Единственный способ сделать это - включить идентификатор безопасности пользователя непосредственно в объект, который вы отправляете.
Контекстная информация безопасности не сохраняется в контекстном прокси, потому что WildFly (до 15.0.1) не работает.
JMS требует, чтобы полезные нагрузки ObjectMessage были сериализуемыми. Однако объект удостоверения безопасности, сохраненный в прокси-сервере (объект org.wildfly.security.auth.server.SecurityIdentity), не является сериализуемым, поэтому он объявляется transient
в реализации прокси-сервера https://github.com/wildfly/wildfly/blob/master/ee/src/main/java/org/jboss/as/ee/concurrent/IdentityAwareProxyInvocationHandler.java.
Следовательно, он не выдерживает последующего процесса сериализации / десериализации сообщений JMS.
Существует старая проблема WildFly, которая была закрыта, но я знаю, что реализация безопасности была полностью заменена с тех пор...