尝试访问IBM MQ中的队列时出现DetailedJMSSecurityException

时间:2014-11-09 11:04:13

标签: java ibm-mq

这是我的问题。

我正在使用IBM MQ V7.1的试用版。我创建了一个队列管理器MYQM,一个MY_SVRCONN的频道MCA User Id abc。我已向用户abc提供了访问MYQM的权限。我正在尝试将消息放入队列Q1。但是在获得队列连接时,我正处于异常之下。

  

com.ibm.msg.client.jms.DetailedJMSSecurityException:JMSWMQ2013:为QueueManager提供的安全认证无效' MYQM'使用连接模式'客户端'和主持人姓名'(1500)'。   请检查所连接的QueueManager上提供的用户名和密码是否正确。

我使用了以下命令允许用户abc访问MYQM

[mqm@localhost ~]$ setmqaut -m MYQM -t qmgr -p abc +connect
The setmqaut command completed successfully.

这是我的Java程序

 public class MqPut
 {
     public static void main(String[] args)
     {
      sendMsg("Sample Message");
     }
     public static void sendMsg(String msg)
     {
       MQQueueConnectionFactory connectionFactory = null;
       QueueConnection queueConn = null;
       QueueSession queueSession = null;
       QueueSender queueSender = null;
       TextMessage message = null;

       try
       {
         connectionFactory = new MQQueueConnectionFactory();
         connectionFactory.setHostName(<MQ SERVER IP>);
         connectionFactory.setPort(1500);
         connectionFactory.setTransportType(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
         connectionFactory.setQueueManager("MYQM");
         connectionFactory.setChannel("MY_SVRCONN");   
         queueConn = connectionFactory.createQueueConnection("abc","password");
         queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
         queueSender = queueSession.createSender(queueSession.createQueue("Q"));   
         queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);   
         message = queueSession.createTextMessage(msg);
         queueSender.send(message);
         queueConn.close();
       }
       catch (Exception je)
       {
           je.printStackTrace();
       }
   }   
  }

我尝试了WebSphere 7, configuring JMS Q connection factory without user id: MQRC_NOT_AUTHORIZED,但我的问题仍然存在。我没有得到我做错的事。任何帮助表示赞赏。

修改

用户abc不属于mqm组

3 个答案:

答案 0 :(得分:2)

您是否在svrconn频道上为用户设置了chlauth(频道验证)?从MQ 7.1开始,通道认证是新的。密码验证仅可从MQ 8获得。基本上,您需要在qmgr svrconn频道上允许来自客户端IP的远程连接。

尝试在mqsc控制台中 SET CHLAUTH(MY_SVRCONN)TYPE(ADDRESSMAP)ADDRESS(客户机的IP)USERSRC(CHANNEL)

如果这不起作用,请检查qmgr日志。它应该确切地说是导致2035年的原因。 这里有一个很好的技术说明http://www-01.ibm.com/support/docview.wss?uid=swg21577137 莫拉格真的很有用的博客https://www.ibm.com/developerworks/community/blogs/aimsupport/entry/blocked_by_chlauth_why?lang=en

答案 1 :(得分:1)

每当您从队列管理器收到任何错误时,请记住,您应该始终查看队列管理器AMQERR01.LOG以获取更详细的说明。对于任何与安全相关的错误尤其如此,因为只有一个错误代码 - MQRC_NOT_AUTHORIZED (2035) - 被转换为JMS异常JMSWMQ2013 - 被返回给应用程序,以便不泄露详细信息的原因。任何潜在的黑客。您必须始终查看队列管理器错误日志以获取详细信息。

答案 2 :(得分:1)

在开发环境(WMQ 8.0)中,我更喜欢修改授权,以便它是可选的。

ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)
REFRESH SECURITY TYPE(CONNAUTH)

(由于安全隐患,建议不要对生产队列管理器禁用此功能。)

在WMQ 7.1中,可以将频道授权设置为禁用,但这似乎不适用于WMQ 8.0

ALTER QMGR CHLAUTH(DISABLED)