2

Я пытаюсь аутентифицировать пользователя, добавляя PHP_AUTH_USER и PHP_AUTH_PW к $_ENV -Variable, но это не влияет. I'am с помощью следующей конфигурации с memory -Хранение:Как unitTest CakePHP 3.x Контроллер Действия, требующие базовой аутентификации HTTP?

$this->loadComponent('Auth', [ 
     'authenticate' => [ 
      'Basic' => [ 
       'fields' => ['username' => 'username', 'password' => 'password'], 
       'userModel' => 'CmUsers' 
      ], 
     ], 
     'storage' => 'Memory', 
     'unauthorizedRedirect' => false 
]); 

Тест терпит неудачу с exception 'Cake\Network\Exception\UnauthorizedException' with message 'Unauthorized'.

public function testIndex() 
{   
    $_ENV['PHP_AUTH_USER'] = 'ApiUser'; 
    $_ENV['PHP_AUTH_PW'] = '123456'; 

    $this->get('/index');     

    $this->assertResponseOk();       
} 

Есть ли у кого-нибудь идеи, как добавить данные аутентификации в запрос?

Если я следовать советам @ndm и добавить Authentication -header ...

$this->configRequest([ 
      'environment' => [ 
       'PHP_AUTH_USER' => 'ApiUser', 
       'PHP_AUTH_PW' => '123456',     
      ], 
      'headers' => ['Authorization' => 'Basic ApiUser:123456'] 
]); 

... в envirement переменные выглядит следующим образом:

[_environment:protected] => Array 
    (
     [HTTP_AUTHORIZATION] => Basic ApiUser:123456 
     [REQUEST_METHOD] => GET 
     [PHP_AUTH_USER] => ApiUser 
     [PHP_AUTH_PW] => 123456 
     [HTTP_X_HTTP_METHOD_OVERRIDE] => 
     [ORIGINAL_REQUEST_METHOD] => GET 
     [SERVER_PORT] => 
     [HTTPS] => 
     [HTTP_HOST] => 
    ) 

Мой Крепеж выглядит следующим образом :

public $records = [ 
    [ 
     'id' => 2, 
     'username' => 'ApiUser', 
     'password' => '123456', 
     'role' => 'api-user', 
     'created' => 1460710056, 
     'modified' => 1460710056 
    ],   
]; 

К сожалению, запрос по-прежнему блокируется.

ответ

2

В тестовых случаях интеграции никогда не следует возиться с суперглобалями, так как они обычно не затрагиваются тестовым случаем, чтобы избежать загрязнения среды тестирования данными, не связанными с CakePHP.

Тестовый запрос может быть сконфигурирован с помощью метода \Cake\TestSuite\IntegrationTestCase::configRequest(). Он принимает массив, который в основном просто передается конструктору \Cake\Network\Request объекта запроса, используемого тестом.

Короче говоря, переменные окружения могут быть определены с помощью ключа environment конфигурации, как

public function testIndex() 
{ 
    $this->configRequest([ 
     'environment' => [ 
      'PHP_AUTH_USER' => 'ApiUser', 
      'PHP_AUTH_PW' => '123456' 
     ] 
    ]); 

    $this->get('/index');     

    $this->assertResponseOk();       
} 

Смотрите также

+0

Спасибо, это хороший совет. К сожалению, запрос по-прежнему блокируется. Мне интересно, нужно ли вручную записывать Userdata вручную в базу данных памяти? В моей разработке все работает отлично, но в моих тестовых таблицах не получается. – Niklas

+0

Даже добавление заголовка '' headers '=> [' Authorization '=>' Basic ApiUser: 123456 '] 'в' configRequest' не работает. – Niklas

+1

@Niklas Works отлично подходит для меня, глядя на ваш обновленный вопрос, ваше устройство неверно, поскольку пароль не хеширован! Данные привязки будут записаны непосредственно в базу данных (через 'Query :: insert/into()'), она не обрабатывается вашими таблицами и объектами, то есть пароль будет сохранен как есть. – ndm