Как выполнить проверку действий контроллера CakePHP 3.x, для которых требуется базовая аутентификация HTTP?


Я пытаюсь аутентифицировать пользователя, добавив PHP_AUTH_USER и PHP_AUTH_PW в переменную $_ENV, но это не влияет. Я использую следующую конфигурацию с memory-хранилищем:

$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...

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

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

[_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
    ],        
];

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

Author: Niklas, 2016-05-19

1 answers

Интеграционные тестовые случаи никогда не должны иметь дело с суперглобальными, так как они обычно не затрагиваются тестовым случаем, чтобы избежать загрязнения тестовой среды данными, не связанными с запросом 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();                         
}

См. также

 2
Author: ndm, 2016-05-19 11:34:59