我有一个C客户端来连接到IBM MQ,并在MQCSP中填写用户ID和密码,如下所示:
void taxPrint(std::vector<TaxPayer> &citizen)
{
int loops = 0;
std::cout << "\nTaxes due for this year: \n" << std::endl;
do
{
std::cout << "Tax Payer #" << loops << " : $" << std::setprecision(2)
<< std::fixed << citizen[loops].taxes / 100. << std::endl;
loops++;
}
while (loops + 1 <= SIZE);
} // Don't miss this bracket!
然后调用MQCONNX()连接MQ服务器,使用用户“ user1”运行客户端,但是服务器始终对运行应用程序“ user1”的用户进行身份验证。
我将MQ服务器设置如下:
MQCNO Connect_options = {MQCNO_DEFAULT};
MQCSP csp = {MQCSP_DEFAULT};
Connect_options.SecurityParmsPtr = &csp;
Connect_options.Version = MQCNO_VERSION_5;
csp.AuthenticationType = MQCSP_AUTH_USER_ID_AND_PWD;
csp.CSPUserIdPtr = "user2";
csp.CSPUserIdLength = strlen("user2");
csp.CSPPasswordPtr = "password";
csp.CSPPasswordLength = strlen((char*)"password");
我如何让MQ服务器对MQCSP中提供的用户进行身份验证?
我在qm.ini中添加了“ ChlauthEarlyAdopt = Y”
此致
答案 0 :(得分:1)
为了为IBM MQ队列管理器以使用在所述MQCSP结构用于授权目的通过ID你需要有QMGR CONNAUTH
的{{1}}与被配置对象AUTHINFO
。在您的示例中,您尝试执行此操作,但是由于对象ADOPTCTX(YES)
默认存在,因此将失败。
如果要更新现有对象,则除非使用SYSTEM.DEFAULT.AUTHINFO.IDPWOS
关键字,否则不能使用DEFINE
对其进行更改,或者可以使用REPLACE
命令来完成此操作
我也建议定义自己的ALTER
对象与你想要的,这将防止未来的升级,从覆盖任何非默认设置的参数。
例如:
AUTHINFO
我也看到你禁用DEFINE AUTHINFO(MY.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKLOCL(OPTIONAL) CHCKCLNT(REQUIRED) ADOPTCTX(YES) LIKE(SYSTEM.DEFAULT.AUTHINFO.IDPWOS)
ALTER QMGR CONNAUTH(MY.AUTHINFO.IDPWOS)
REFRESH SECURITY TYPE(CONNAUTH)
,通常默认的CHLAUTH
规则是不会引起任何问题,只会阻止两件事情:
CHLAUTH
开头的任何频道,而您没有这样做。可以不作为MQ管理员用户连接诸如SYSTEM
,或等同物。我看到您的示例显示了mqm
,如果这是user2
组中的用户,那么您将被屏蔽。
@MoragHughson写了一个不错的IBM developerWorks MQdev博客,标题为“ Getting going without turning off MQ Security”,它解释了如何保持此安全性,这将是一个很好的起点。