这是我的问题。
我正在使用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组
答案 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)