javax.jms.JMSSecurityException: невозможно проверить пользователя: null

Окружающая среда:

Jboss 7.1.0 ОС Windows

Я пытаюсь провести простой тест, чтобы опробовать JMS с использованием Jboss со встроенным провайдером HornetQ JMS. После долгих игр мне удалось получить ответ с этой конфигурацией

        final Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        env.put(Context.PROVIDER_URL, "remote://localhost:4447");
        env.put(Context.SECURITY_PRINCIPAL, "appuser2");
        env.put(Context.SECURITY_CREDENTIALS, "s3cr3t");        

Проблема в том, что когда я запускаю его, я получаю следующую ошибку:

javax.jms.JMSSecurityException: Unable to validate user: null
    at org.hornetq.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:286)
    at org.hornetq.core.client.impl.ClientSessionFactoryImpl.createSessionInternal(ClientSessionFactoryImpl.java:695)
    at org.hornetq.core.client.impl.ClientSessionFactoryImpl.createSession(ClientSessionFactoryImpl.java:264)
    at org.hornetq.jms.client.HornetQConnection.authorize(HornetQConnection.java:589)
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:694)
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnection(HornetQConnectionFactory.java:121)
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnection(HornetQConnectionFactory.java:116)
    at com.jms.client.ConsoleClient.runExample(ConsoleClient.java:51)
    at com.jms.client.ConsoleClient.main(ConsoleClient.java:20)
Caused by: HornetQException[errorCode=105 message=Unable to validate user: null]
    ... 9 more

Я искал в Google, и каждый пример, кажется, указывает на то, как настроить параметры безопасности с помощью HornetQ в качестве автономного сервера. Я не могу понять, как настроить пользователя на Jboss и нужно ли мне это вообще.

Любые идеи?


person ziggy    schedule 02.03.2012    source источник
comment
Я помню, как некоторое время назад у меня была эта проблема с JBoss 5.1.0GA. Я помню, как исправил это, добавив в hornetq.sar/hornetq-users.xml нужного пользователя/каждую очередь. Я не знаю, как hornetQ используется в JBoss 7, но, возможно, эта подсказка укажет вам правильное направление.   -  person Sergiu    schedule 06.03.2012


Ответы (7)


Я согласен с Серджиу и хотел бы добавить, что очередь может быть настроена без запроса имени пользователя и пароля.

person fowbar    schedule 25.04.2012

Кажется, вы создаете QueueConnection с именем пользователя и паролем следующим образом:

QueueConnection qcon = qconFactory.createQueueConnection("appuser2","s3cr3t");

Если вы этого не сделаете, вы получите эту ошибку

Невозможно проверить пользователя: ноль.

И если вы не хотите использовать имя пользователя и пароль, вы можете установить безопасность с включенным значением false следующим образом:

<subsystem xmlns="urn:jboss:domain:messaging:1.1">
     <hornetq-server>
         <security-enabled>false</security-enabled>
         ......
     </hornetq-server>
</subsystem>

Затем вы можете создать QueueConnection без имени пользователя и пароля следующим образом:

QueueConnection qcon = qconFactory.createQueueConnection();
person Allen    schedule 08.07.2012

это сработало для меня. Я только что добавил следующее в standalone-full.xml:

            <security-enabled>false</security-enabled> 
person Ozz Zahir    schedule 06.11.2015

Проверьте свой standalone-full.xml. Если конфигурации роли в urn:jboss:domain:messaging-activemq:1.0 выглядят так:

<security-setting name="#">
   <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
</security-setting>

Затем вы должны:

  1. Создайте гостевого пользователя (убедитесь, что вы установили роль guest для пользователя);
  2. Установите начальный контекст, как показано ниже:
Properties props = new Properties();
props.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
props.put(Context.SECURITY_PRINCIPAL, "username");
props.put(Context.SECURITY_CREDENTIALS, "password");
InitialContext ctx = new InitialContext(props);
  1. Создайте контекст, как показано ниже:
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("jms/RemoteConnectionFactory");
Queue queue = (Queue) ctx.lookup("jms/queue/queueName");
JMSContext context = cf.createContext("username", "password");
person Realdinho    schedule 09.08.2017

Если кто-то использует версию JBoss EAP 7.2, то вот решение.

Если вы не хотите отключать защиту, добавляя тег <security enabled="false"/>, и хотите аутентифицироваться с помощью имени пользователя и пароля, выполните следующие действия.

  1. Какое бы имя пользователя (скажем, 'jmsuser') и пароль (скажем, 'pass') вы не написали в своем коде, именно этого пользователя ('jmsuser') нужно сначала создать в JBoss. Пожалуйста, используйте утилиту добавления пользователя в папке bin и добавьте пользователя в качестве пользователя приложения и назначьте ему гостевую роль при появлении запроса.

screenshot_add_user

  1. После вышеуказанного шага имя пользователя и сведения о роли можно найти в пути \standalone\configuration к файлу application-role.properties и application-users.properties.

  2. Перезапустите сервер JBoss.

  3. Предполагая, что вы используете спецификацию JMS 2.0, создайте JMSContext, как показано ниже.

JMSContext jmsCtx = connectionFactory.createContext("jmsuser", "pass");
  1. Запустите код сейчас, и вы больше не столкнетесь с этой ошибкой.
person Shirshendu Deb Roy    schedule 08.06.2021

Добавьте очередь в jboss, используя from cli:

jms-topic add --topic-address=testTopic -–entries=topic/test,java:jboss/exported/jms/topic/test

Добавьте пользователя следующим образом:

add-user.bat -a -u mquser -p mqpassword -g guest

Потребитель вставляет код в основной метод:

Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.wildfly.naming.client.WildFlyInitialContextFactory");
properties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
properties.put("jboss.naming.client.ejb.context", true);
properties.put("java.naming.security.principal", "mquser");
properties.put("java.naming.security.credentials", "mqpassword");
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");

QueueConnection cnn = null;
QueueSender sender = null;
QueueSession session = null;
InitialContext ctx = new InitialContext(properties);
Queue queue = (Queue) ctx.lookup("jms/queue/tests");
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("jms/RemoteConnectionFactory");
cnn =  factory.createQueueConnection("mquser", "mqpassword");
cnn.start();

session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
TextMessage msg = session.createTextMessage("Hello World");
sender = session.createSender(queue);
sender.send(msg);

System.out.println("Message sent successfully to remote queue.");

@MessageDriven(name = "ExampleMDB", activationConfig = {
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "testQueues"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
public class ExampleMDB implements MessageListener {

    /**
     * Default constructor. 
     */
    public ExampleMDB() {
        // TODO Auto-generated constructor stub
    }


    @Override
    public void onMessage(Message arg0) {
        System.out.println("----------------");
        try {
            System.out.println("Received message" + ((TextMessage)arg0).getText());
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("----------------");

    }

}
person Jainender Chauhan    schedule 02.05.2020

Если вы используете WildFly 10+ (я использую WildFly 18), вы должны отключить защиту, добавив:

<security enabled="false"/>

в вашем standalone-full.xml (директория wildFly/standalone/configuration) внутри:

    <subsystem xmlns="urn:jboss:domain:messaging-activemq:8.0">

и

<server name="default">

Что-то подобное:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:8.0">
                <server name="default">
			
                <!-- Disable security with the following row, otherwise of course it will give error without authentication in java -->
                <security enabled="false"/>
				
                <statistics enabled="${wildfly.messaging-activemq.statistics-enabled:${wildfly.statistics-enabled:false}}"/>
                <security-setting name="#">
                    <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
                </security-setting>
                <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
                <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
                <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
                    <param name="batch-delay" value="50"/>
                </http-connector>
                <in-vm-connector name="in-vm" server-id="0">
                    <param name="buffer-pooling" value="false"/>
                </in-vm-connector>
                <http-acceptor name="http-acceptor" http-listener="default"/>
                <http-acceptor name="http-acceptor-throughput" http-listener="default">
                    <param name="batch-delay" value="50"/>
                    <param name="direct-deliver" value="false"/>
                </http-acceptor>
                <in-vm-acceptor name="in-vm" server-id="0">
                    <param name="buffer-pooling" value="false"/>
                </in-vm-acceptor>
                <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
                <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
                <!-- Adding a new queue -->
		<jms-queue name="ShippingQueue" entries="java:jboss/exported/jms/queue/ShippingQueue"/>
				

                <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
                <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
                <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>

            </server>
        </subsystem>

Проверьте: https://developer.jboss.org/thread/271457

person Alfonso Silvestri    schedule 18.05.2020