Spring JmsTemplate + Security - PullRequest
       18

Spring JmsTemplate + Security

3 голосов
/ 07 июля 2010

Я только что переработал код, опубликованный в теме JMS, чтобы использовать класс Spring JmsTemplate, и теперь я получаю исключение, сообщающее, что я не аутентифицирован.

Ранее я создал фабрику, установил соединение, затем сеанс и т. Д. Следующим образом:

MQTopicConnectionFactory factory = new MQTopicConnectionFactory();
factory.setQueueManager(qMgr);   
factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
factory.setHostName(hostname);
factory.setPort(listenerPort);
factory.setChannel(channel);
// setting username and password to be empty string ==> no authentication
connection = factory.createConnection("", "");   
...
connection.start();

Я не вижу нигде в JmsTemplate для установки имени пользователя и пароля на пустые строки. Мой конфиг выглядит так:

<bean id="jmsFactory" class="com.ibm.mq.jms.MQTopicConnectionFactory">
    <property name="queueManager">
        <value>ACT01</value>
    </property>
    <property name="hostName">
        <value>xx.xx.xx.xx</value>
    </property>
    <property name="port">
        <value>15004</value>
    </property>
    <property name="transportType">
        <value>1</value>
    </property>
    <property name="channel">
        <value>CONDUCTOR.ACT01</value>
    </property>
</bean>

<bean id="impactJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory">
        <bean class="org.springframework.jms.connection.SingleConnectionFactory">
            <property name="targetConnectionFactory">
                <ref local="jmsFactory" />
            </property>
        </bean>
    </property>
</bean>

Я также попытался обернуть jmsFactory в UserCredentialsConnectionFactoryAdapter объект безрезультатно:

<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
    <property name="targetConnectionFactory" ref="jmsFactory"/>
    <property name="username" value=""/>
    <property name="password" value=""/>
</bean> 

Трассировка стека:

Caused by: com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'LOROL' with connection mode 'Client' and host name 'xx.xx.xx.xx'. Please check if the supplied username and password are correct on the QueueManager you are connecting to
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:531)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:219)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:410)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:7855)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7331)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:276)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6055)
at com.ibm.mq.jms.MQTopicConnectionFactory.createTopicConnection(MQTopicConnectionFactory.java:114)
at com.ibm.mq.jms.MQTopicConnectionFactory.createConnection(MQTopicConnectionFactory.java:197)
at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:343)
at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:290)
at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:227)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:461)
... 25 more
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:206)
... 37 more

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Несколько вариантов здесь ...

  • Свойства, которые вы настраивали ранее, привели к тому, что канал работал в качестве администратора.Чтобы получить ту же функциональность, вы можете установить MCAUSER канала на любой идентификатор, под которым работает QMgr (обычно mqm для UNIX и MUSR_MQADMIN в Windows).Boom.Готово.Ваш дядя Боб.
  • Да, это означает, что любой, кто подключается к этому каналу, является администратором.С другой стороны, это не хуже, чем было раньше, как продемонстрировал ваш предыдущий код, работающий так же, как он.
  • Вы все еще можете использовать Spring и передать ID и пароль, как описано в thisсообщение на форуме .Просто имейте в виду, что пароль на самом деле не проверен.Независимо от того, какой ID вы передаете, он принимается за чистую монету, если вы не используете выход канала для его проверки.

Подробнее о безопасности WMQ для клиентских подключений см. Презентацию Hardening WebSphere MQ ,Если вы хотите на самом деле защитить доступ к QMgr, вам нужно установить для MCAUSER идентификатор пользователя с низким уровнем привилегий, выполните команды setmqaut, чтобы авторизовать группу этого идентификатора, а затем заблокируйте все другие каналы, такие как SYSTEM.AUTO. * И SYSTEM.DEF. * Чтобы они не могли бежать.

0 голосов
/ 11 января 2012

Я использую Websphere на локальном компьютере с Windows и подключаюсь к серверу MQ на компьютере с Unix.У меня работал только третий вариант.Установка идентификатора пользователя из консоли не работала. Я пробовал mqm и MUSR_MQADMIN.

// соединение, созданное с использованием имени пользователя и пароля. QueueConnection connection = factory.createQueueConnection ("mqm", "mqm");

...