Как разрабатывать, подделывая логин для тестирования ACL в Symfony 2

Я разрабатываю часть веб-приложения, основанную на Symfony 2. Как и во многих приложениях, требуется аутентификация и авторизация. Как я могу продолжать развиваться, принимая соображения ACL, пропуская или подделывая логин?

В документах login_check выполняет проверку подлинности и сеансов. Я думаю, что мне может понадобиться реализовать версию этого или каким-то образом вызвать его для входа в систему как разные пользователи / роли

Я не совсем уверен, что понимаю ваш вопрос, но вы просто спрашиваете, как вы входите в систему программно?

В моих тестах я просто звоню как:

 $this->container->get('security.context')->setToken( new UsernamePasswordToken( 'maintenance', null, 'main', array('ROLE_FIXTURE_LOADER') ) ); 

В этом случае «обслуживание» – это даже не реальная пользовательская сущность, это просто имя пользователя, которое я составил для своих приборов, чтобы они могли получить доступ к службе с помощью ROLE_FIXTURE_LOADER но если вы хотите войти в систему как полнофункциональный пользовательский объект (так что они имеют правильный идентификатор ACL), вы можете получить объект $user из базы данных и вызвать:

 $this->container->get('security.context')->setToken( new UsernamePasswordToken( $user, null, 'main', $user->getRoles()) ) ); 

Это не делает полный вход, но он работает с RBAC, и я не понимаю, почему он не будет работать с ACL, если вы передадите фактический пользовательский объект.

Что касается функционального тестирования моего интерфейса, если мне нужно войти в систему, я просто перейду на страницу входа и отправлю форму в соответствии с документами тестирования. Для любого из тех, кто работает, вам нужен доступ к контейнеру, поэтому вам нужно расширить WebTestCase или WebTestCase свою собственную способность загружать ядро ​​(см. Здесь ).

У меня такое чувство, что я неправильно понял вопрос (т. Е. Вам нужно сделать что-то более сложное, чем просто поставить токен). Возможно, вы могли бы попытаться разъяснить немного больше, что вы подразумеваете под

прохождение или подделка логина

Конкретный пример установки маркера безопасности в тесте:

Сначала мы создаем базовый класс для наших тестов, которые содержат метод удобства входа. Это можно сделать, расширив WebTestCase и используя метод getContainer на client или вы можете вытащить WebTestCase отдельно, чтобы свернуть собственный базовый класс, который просто загружает ядро ​​без клиента и возвращает контейнер (см. Мою ссылку на два решения для достижения этого) ,

 namespace Acme\SomeBundle\Tests; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; abstract class AcmeTestCase extends WebTestCase { protected function loginAs($client, $username) { $container = $client->getContainer(); $doctrine = $container->get('doctrine'); $user = $this->loadUser($doctrine, $username); // First Parameter is the actual user object. // Change 'main' to whatever your firewall is called in security.yml $container->get('security.context')->setToken( new UsernamePasswordToken( $user, null, 'main', $user->getRoles() ) ); } private function loadUser($doctrine, $username) { // Don't have to use doctrine if you don't want to, you could use // a service to load your user since you have access to the // container. // Assumes User entity implements UserInterface return $doctrine ->getRepository('AcmeUserBundle:User') ->findOneByUsername($username); } } 

Тогда вам просто нужно использовать свой базовый класс в любом тесте, который вы хотите. Вот так:

 namespace Acme\SomeBundle\Tests\Entity; use Acme\SomeBundle\Tests\AcmeTestCase; class SomeEntityTest extends AcmeTestCase { public function somethingTest() { $this->loginAs(static::createClient(), 'SomeUsernameInDB'); // Do the rest of your test here. } } 

Надеюсь, это поможет.

Не уверен, что я хорошо понимаю ваш вопрос, но если вы просто хотите увидеть приложение с другой ролью пользователя, вы можете использовать Symmetric Role Switcher, описанный здесь: http://symfony.com/doc/current/book/security.html#impersonating -Пользователь

Поэтому вам просто нужно указать параметр в своем URL-адресе для просмотра своего приложения в качестве другого подключенного пользователя.

Надеюсь, поможет !