【问题标题】:How to unitTest CakePHP 3.x Controller Actions that require HTTP Basic Authentication?如何对需要 HTTP 基本身份验证的 CakePHP 3.x 控制器操作进行单元测试?
【发布时间】:2016-09-16 05:51:38
【问题描述】:

我正在尝试通过将PHP_AUTH_USERPHP_AUTH_PW 添加到$_ENV-Variable 来验证用户,但这没有任何影响。我正在使用memory-Storage 的以下配置:

$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']
]); 

...环境变量如下所示:

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

不幸的是,请求仍然被阻止。

【问题讨论】:

    标签: unit-testing cakephp basic-authentication cakephp-3.x cakephp-3.2


    【解决方案1】:

    集成测试用例不应该摆弄超全局变量,因为它们通常不会被测试用例触及,以避免与非 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();                         
    }
    

    另见

    【讨论】:

    • 谢谢,这是个好建议。不幸的是,请求仍然被阻止。我想知道我是否必须以某种方式在内存数据库中手动写入用户数据?!在我的开发环境中它工作正常,但在我的测试用例中失败了。
    • 即使将标题 'headers' => ['Authorization' => 'Basic ApiUser:123456'] 添加到 configRequest 也不起作用。
    • @Niklas 对我来说很好,查看您更新的问题,您的设备不正确,因为密码没有经过哈希处理!夹具数据将直接写入数据库(通过Query::insert/into()),它不会被您的表和实体处理,即密码将按原样存储。
    猜你喜欢
    • 2015-07-30
    • 2015-06-24
    • 2017-07-28
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多