Почему PHP XMLSERVICE call не использует аутентифицированного пользователя при выполнении команд, вызывающих программы

У нас Zend PHP 7.2 работает на IBM i OS 7.2.

При выполнении программных вызовов или выполнении команд с помощью инструментария XMLSERVICE их выполнение выполняется в профиле 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 и получали ошибки авторизации, которые не должны происходить для аутентифицированного пользователя (работал тот же API, вызванный из 5250 тем же пользователем).

1 ответ

Решение

Это было решено с помощью замечательного Алана Сейдена ( http://www.seidengroup.com/), который указал на выбор соединения без сохранения состояния и состояния.

В частности, по умолчанию соединение не будет иметь состояния, и это означает, что оно выполняется под общим заданием на сервере под пользователем QTMHHTTP. Однако, указав следующий параметр в наборе инструментов, запускается задание частного сервера с сохранением состояния. Это означает, что оно не только выполняется под аутентифицированным пользователем, но и задание остается активным и сохраняет свои файловые курсоры, содержимое QTEMP и т. Д.

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

Это упоминается в слайдах Алана здесь (p54): https://www.seidengroup.com/toolkit/

Другие вопросы по тегам