6

我正在尝试测试一个 API 调用方法,该方法使用 Basic Auth 进行安全保护,并且需要从安全上下文中检索用户。

我的 config_test.yml 文件(我正在使用内存数据库进行测试环境):

imports:
    - { resource: config_dev.yml }

doctrine:
    dbal:
        driver: pdo_sqlite
        path: :memory:
        memory: true
    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

framework:
    test: ~
    session: ~ 
    profiler:
        enabled: false

web_profiler:
    toolbar: false
    intercept_redirects: false

swiftmailer:
    disable_delivery: true

我创建了一个测试,在其中实例化了一个客户端,如下所示:

    $options =  array(
        'environment' => 'test',
        'debug'       => true,
    );

    $this->client = static::createClient($options);

测试看起来像:

public function testProfileAction()
{
    $mockUser = new User();
    $mockUser->setUsername("user");
    $mockUser->setEmail("user@user.com");
    $mockUser->setName("User");
    $mockUser->setSurname("User");
    $mockUser->setPlainPassword("1234567890");
    $this->em->persist($mockUser);
    $this->em->flush();

    $crawler = $this->client->request('GET', '/api/1/user/profile', array(), array(), array(
        'PHP_AUTH_USER' => 'user',
        'PHP_AUTH_PW'   => '1234567890',
    ));
    $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}

并且该方法需要从安全上下文中获取用户。

$user = $this->get('security.context')->getToken()->getUser();

但是,运行测试我总是得到 401 而不是 200。在方法中转储 $user 变量总是空的。

我正在使用 Symfony 2.2 和 FOSUserBundle。

提前致谢。

4

2 回答 2

5

我有同样的问题。正如@nifr 所说,您必须创建令牌,但您还必须对其进行序列化并创建cookie。这是我的做法。

$token = new UsernamePasswordToken($mockUser, null, $firewallName, array($role));
self::$kernel->getContainer()->get('security.context')->setToken($token);
self::$kernel->getContainer()->get('session')->set('security'.$firewallName, serialize($token));
self::$kernel->getContainer()->get('session')->save();

$cookie = new Cookie(self::$kernel->getContainer()->get('session')->getName(),     self::$kernel->getContainer()->get('session')->getId());
$this->client->getCookieJar()->set($cookie);
于 2013-05-30T13:37:35.723 回答
0

您必须先创建令牌才能从安全上下文中访问它。

$firewallName = 'main';
$role = 'ROLE_USER';

$token = new UsernamePasswordToken($user, null, $firewallName, array($role));
self::$kernel->getContainer()->get('security.context')->setToken($token);

从这里适应您的情况的示例。

于 2013-05-30T12:07:09.397 回答