为什么在 运行 命令、调用程序时 XMLSERVICE 调用不使用经过身份验证的用户?
Why does XMLSERVICE call not use authenticated user when running commands, calling programs?
我们在 IBM i OS 7.2.
上安装了 Zend PHP 7.2 运行ning
通过 XML 服务工具包进行程序调用或执行命令时,这些操作是在 QTMHHTTP 配置文件下执行的,而不是连接的经过身份验证的用户。这导致了各种权限问题。
以下代码本应出现身份验证错误而失败。如果我用真实值替换用户配置文件和密码值,则会正确创建输出并且 DSPJOB 输出显示 XMLSERVICE 作业的当前用户是 QTMHHTTP,而不是指定的用户。
<html>
<head>
<title>Connection Test</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
</head>
<body>
<div class="container m-4">
<h1>Connection Test</h1>
<?php
include_once zend_deployment_library_path('PHP Toolkit for IBMI i') . DIRECTORY_SEPARATOR . 'ToolkitService.php';
$user = 'MYID'; $passwd = 'MYPWD';
$options = array('i5_naming'=>DB2_I5_NAMING_ON);
try { $connection = db2_connect('*LOCAL', $user, $passwd, $options); }
catch (Exception $e) { echo $e->getMessage(), "\n"; print db2_conn_errormsg(); exit(); }
try { $toolkit = ToolkitService::getInstance($connection, DB2_I5_NAMING_ON); }
catch (Exception $e) { echo $e->getMessage(), "\n"; exit(); }
$output = $toolkit->CLInteractiveCommand('DSPJOB');
echo"<div class='alert alert-info alert-dismissible'>";
echo "<button type='button' class='close' data-dismiss='alert'>×</button>";
echo "<pre>"; print_r($output); echo "</pre>";
echo "</div>";
?>
</div>
</body>
</html>
显然正在进行身份验证,因为提供的凭据必须是正确的。但是,我可以通过使用默认的 'QTMHHTTP' 连接模式简单地清空用户配置文件和密码字段来获得相同的输出。
我们缺少什么才能在经过身份验证的用户下获得 运行 的功能?
请注意,问题是在我们尝试调用系统 API 时发现的,并且得到的权限错误不应发生在经过身份验证的用户(相同的 API 从 5250 调用相同的用户工作)。
在出色的 Alan Seiden (http://www.seidengroup.com) 的帮助下解决了这个问题,他指出了 stateless/stateful 连接选择。
具体来说,默认情况下连接是无状态的,这意味着它 运行 在服务器上的一个普通作业下,在用户 QTMHHTTP 下。但是,通过在 Toolkit 上指定以下选项,将启动一个私有的、有状态的服务器作业。这意味着它不仅 运行 在经过身份验证的用户下,而且作业保持活动状态并保留其文件游标、QTEMP 内容等
$toolkit->setToolkitServiceParams(array('InternalKey'=>"/tmp/$user"));
Alan 的幻灯片中提到了这一点 (p54):https://www.seidengroup.com/toolkit/
我们在 IBM i OS 7.2.
上安装了 Zend PHP 7.2 运行ning通过 XML 服务工具包进行程序调用或执行命令时,这些操作是在 QTMHHTTP 配置文件下执行的,而不是连接的经过身份验证的用户。这导致了各种权限问题。
以下代码本应出现身份验证错误而失败。如果我用真实值替换用户配置文件和密码值,则会正确创建输出并且 DSPJOB 输出显示 XMLSERVICE 作业的当前用户是 QTMHHTTP,而不是指定的用户。
<html>
<head>
<title>Connection Test</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
</head>
<body>
<div class="container m-4">
<h1>Connection Test</h1>
<?php
include_once zend_deployment_library_path('PHP Toolkit for IBMI i') . DIRECTORY_SEPARATOR . 'ToolkitService.php';
$user = 'MYID'; $passwd = 'MYPWD';
$options = array('i5_naming'=>DB2_I5_NAMING_ON);
try { $connection = db2_connect('*LOCAL', $user, $passwd, $options); }
catch (Exception $e) { echo $e->getMessage(), "\n"; print db2_conn_errormsg(); exit(); }
try { $toolkit = ToolkitService::getInstance($connection, DB2_I5_NAMING_ON); }
catch (Exception $e) { echo $e->getMessage(), "\n"; exit(); }
$output = $toolkit->CLInteractiveCommand('DSPJOB');
echo"<div class='alert alert-info alert-dismissible'>";
echo "<button type='button' class='close' data-dismiss='alert'>×</button>";
echo "<pre>"; print_r($output); echo "</pre>";
echo "</div>";
?>
</div>
</body>
</html>
显然正在进行身份验证,因为提供的凭据必须是正确的。但是,我可以通过使用默认的 'QTMHHTTP' 连接模式简单地清空用户配置文件和密码字段来获得相同的输出。
我们缺少什么才能在经过身份验证的用户下获得 运行 的功能?
请注意,问题是在我们尝试调用系统 API 时发现的,并且得到的权限错误不应发生在经过身份验证的用户(相同的 API 从 5250 调用相同的用户工作)。
在出色的 Alan Seiden (http://www.seidengroup.com) 的帮助下解决了这个问题,他指出了 stateless/stateful 连接选择。
具体来说,默认情况下连接是无状态的,这意味着它 运行 在服务器上的一个普通作业下,在用户 QTMHHTTP 下。但是,通过在 Toolkit 上指定以下选项,将启动一个私有的、有状态的服务器作业。这意味着它不仅 运行 在经过身份验证的用户下,而且作业保持活动状态并保留其文件游标、QTEMP 内容等
$toolkit->setToolkitServiceParams(array('InternalKey'=>"/tmp/$user"));
Alan 的幻灯片中提到了这一点 (p54):https://www.seidengroup.com/toolkit/