【问题标题】:Handling Authentication in Symfony2 Unit-Tests在 Symfony2 单元测试中处理身份验证
【发布时间】:2011-12-15 15:25:41
【问题描述】:

我想为通过 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 状态码。

【问题讨论】:

  • 302 是一个重定向。你能检查一下你被重定向到哪里了吗?
  • @kuba 它是对登录表单的重定向(表单登录是我的应用程序中进行身份验证的常规方式)。
  • 我解决了重定向问题,但现在我有一个状态码 401

标签: authentication symfony


【解决方案1】:

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

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

此外,一旦你让它正常工作,你可以重新打开表单验证,因为 Symfony 没有任何理由使用表单的入口点(

希望有帮助!

【讨论】:

    【解决方案2】:

    在我的例子中,问题是测试环境使用了一个单独的数据库,但我忘记了用用户填充它。 m)

    我知道,这可能并不能真正解决您的问题,但让我们看看如果每个有相同问题的人都投赞成票,这会得到多少赞成票。如果没有人这样做,好吧,我是唯一一个那么愚蠢的人。

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

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2012-01-30
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2015-10-21
      • 1970-01-01
      • 2014-09-10
      相关资源
      最近更新 更多