Symfony2: получение учетных данных пользователя из тестовой конфигурации

Я выполняю функциональное тестирование в своем приложении Symfony2 и хочу обеспечить безопасность контроллера, проверив, что только пользователи с соответствующими ролями могут получить доступ к моим действиям контроллера. Я настроил двух пользователей с разными ролями, которые аутентифицируются с помощью основных учетных данных:

providers:
    in_memory:
        users:
            basic: { password: basic, roles: ROLE_BASIC }
            admin: { password: admin, roles: ROLE_ADMIN }

Я не хочу жестко кодировать этих пользователей в каждом тесте, который я пишу (я буду писать много). В идеале я хотел бы получить информацию о пользователях, которых я определил в своей конфигурации, из контейнера. Это возможно? т.е. вместо этого:

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

Я хочу сделать это:

// Get the user details from the container
$users = $this->container->get('something');
$user = $users['admin'];

$crawler = $client->request('GET', '/inventory/index', array(), array(), 
    array(
        'PHP_AUTH_USER' => $user->getUsername(),
        'PHP_AUTH_PW' => $user->getPassword()
    ));

person Craig    schedule 02.02.2012    source источник


Ответы (2)


Взгляните на LiipFunctionalTestBundle, особенно на базовый класс WebTestCase, здесь.

Я не использовал этот пакет лично, но он утверждает, что учитывает аутентификацию в ваших тестовых примерах.

Обновить

Возможно, вам лучше загружать Users как фикстуры, а не в памяти. Если вы не используете базу данных, настройте LiipFunctionalTestBundle для использования SQLite. Таким образом, вы можете получить доступ к каждому пользователю из ваших тестов.

Кроме того, хотя, вероятно, это и не рекомендуется, вы можете изменить liip_functional_test.authentication в любое время, выполнив что-то вроде этого:

$this->getContainer()->setParameter('liip_functional_test.authentication', 'new_value');
person leek    schedule 02.02.2012
comment
Спасибо - я пробовал этот пакет (на самом деле я использую его для кэширования тестовой базы данных), но он не решает мою проблему. Это позволяет мне указать пользователя для аутентификации, как в файле конфигурации, с помощью параметра «liip_functional_test.authentication». Однако, поскольку я намерен делать запросы с большим количеством разных пользователей, каждый из которых имеет разные роли, это не решает мою проблему - в идеале мне нужен доступ ко всем учетным данным пользователя в моем тестовом классе, хотя я думаю, что мог бы последовать их примеру и просто дублировать детали в качестве пользовательской настройки для моего пакета. - person Craig; 02.02.2012
comment
Я надеялся добиться этого без использования фикстур, потому что не хотел добавлять дополнительные накладные расходы к каждому тесту, который и без того работает медленнее, чем хотелось бы. Однако это жизнеспособное последнее средство, я сначала попробую подход YAML, предложенный @Florian, и, если это не сработает, я выберу приспособления. Спасибо! - person Craig; 03.02.2012
comment
Вы всегда можете просто использовать одного пользователя и добавлять/удалять от него роли. - person leek; 03.02.2012
comment
В итоге мы использовали фикстуры, следуя подходу, аналогичному gist.github.com/1223886. Спасибо за предложение! - person Craig; 06.02.2012

Если вы находитесь в тестовой среде и не хотите погружаться в сложные вещи, действительно самый простой способ — проанализировать файл, содержащий поставщика в памяти, с помощью синтаксического анализатора Yaml и использовать его для кормить запросы клиентов.

Использование LiipFunctionalTestBundle заставит вас определить одного и только пользователя для подключения. Более того, это заставит вас дублировать эту информацию, один раз в разделе ваших поставщиков безопасности и один раз в ваших параметрах DI.

Последний вариант — определить собственную службу, которая использует частные службы безопасности для настройки себя. Это гораздо сложнее и менее удобно, чем простой разбор yaml :).

person Florian Klein    schedule 02.02.2012
comment
Разбор YAML звучит так, как будто это самый быстрый и простой вариант, даже если бы я надеялся на что-то более интегрированное. Я попробую, спасибо! - person Craig; 03.02.2012
comment
Этот подход сделал то, что я изначально хотел сделать, но когда я написал больше тестов, я понял, что в конечном итоге мне нужно будет использовать реальных пользователей, поэтому я остановился на фикстурах. Спасибо за помощь! - person Craig; 06.02.2012