在Symfony2单元测试中处理身份验证

时间:2011-12-15 15:25:42

标签: authentication symfony

我想为通过Symfony2身份验证机制保护的控制器编写功能测试。我阅读了很多描述它的教程,但不幸的是,所有这些教程对我来说都不适用于当前的Symfony2版本(测试2.0.4到2.0.7)

到目前为止我做了什么:

在config_test.yml中添加安全设置

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

    providers:
        main:
            users:
                admin:  { password: adminsmurf, roles: [ 'ROLE_USER' ] }
                inventory: { password: inventorysmurf, roles: [ 'ROLE_ADMIN', 'ROLE_USER', 'ROLE_INVENTORY' ] }
                andon: { password: andonsmurf, roles: [ 'ROLE_ADMIN', 'ROLE_ANDON' ] }

    firewalls:
        main:
            pattern:    /.*
            http_basic:
                realm: "Secured Area"
                provider: main
            logout:     true
            security:   true
            stateless:  true
            anonymous: true

单元测试

class DefaultControllerTest extends WebTestCase
{

    public function testCorrectAuthentificationCredentials()
    {
        $client = static::createClient();

        $crawler = $client->request('GET', '/inventory/index', array(), array(), 
                                    array(
                                          'PHP_AUTH_USER' => 'admin',
                                          'PHP_AUTH_PW' => 'adminsmurf'
                                        ));

        $response = $client->getResponse();

        $this->assertEquals(200, $response->getStatusCode());
    }
}

此测试失败(预期200,获得302)。任何人都可以帮助我做错了吗?

更新16/12

我更进了一步。因为我在常规安全文件中使用表单登录。 Symfony刚刚将http_basic登录添加到防火墙。这就是重定向的原因(302)。我刚刚添加了一个

form_login: false

到测试安全设置。现在没有重定向,但我得到401状态代码。

2 个答案:

答案 0 :(得分:3)

我显示HTTP基本身份验证应该作为请求的第4个参数,而不是第5个。来源是文档 - 如果它们不起作用,我们需要更新它们。但请告诉我:

http://symfony.com/doc/2.0/cookbook/testing/http_authentication.html

此外,一旦你正常工作,你可以重新打开表单身份验证,因为Symfony没有任何理由使用表单的入口点(< - fancy word :))来重定向你。

希望有所帮助!

答案 1 :(得分:1)

在我的情况下,问题是测试环境使用单独的数据库,但我忘记用用户填充它。米)

我知道,这可能不是你问题的真正解决方案,但让我们看看如果每个有同样问题的人都投票支持多少赞成票。如果没有人,那么,我是唯一一个愚蠢的人。

顺便说一句,您可以尝试使用内存提供程序来查看由于数据库问题等原因您的身份验证是否失败。这就是我发现问题的原因。