为什么在运行命令,调用程序时,PHP XMLSERVICE调用不使用经过身份验证的用户

时间:2019-02-12 21:35:10

标签: php authentication db2-400 db2-connect xmlservice

我们在IBM i OS 7.2上运行了Zend PHP 7.2。

通过XMLSERVICE Toolkit进行程序调用或执行命令时,将在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'>&times;</button>";
        echo "<pre>"; print_r($output); echo "</pre>";
        echo "</div>";
      ?>
    </div>
  </body>
</html>

很显然,正在进行身份验证,因为提供凭据时,它们必须正确。但是,使用默认的“ QTMHHTTP”连接模式,只需清空用户配置文件和密码字段即可获得相同的输出。

要使功能在经过身份验证的用户下运行,我们缺少什么?

请注意,当我们尝试调用系统API并获得授权用户不应该发生的授权错误时,发现了该问题(同一用户从5250调用了相同的API)。

1 个答案:

答案 0 :(得分:0)

这是在出色的Alan Seiden(http://www.seidengroup.com)的帮助下解决的,他指出了无状态/有状态的连接选择。

具体来说,默认情况下,连接将是无状态的,这意味着它在用户QTMHHTTP下的服务器上的常规作业下运行。但是,通过在工具包上指定以下选项,将启动私有的有状态服务器作业。这意味着它不仅在经过身份验证的用户下运行,而且该作业保持活动状态并保留其文件光标,QTEMP内容等。

$toolkit->setToolkitServiceParams(array('InternalKey'=>"/tmp/$user"));

这在艾伦(Alan)的幻灯片(p54)中提到:https://www.seidengroup.com/toolkit/