Как разработать путем фальсификации входа в систему для проверки ACL в Symfony 2 - PullRequest
10 голосов
/ 10 декабря 2011

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

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

Ответы [ 3 ]

29 голосов
/ 12 декабря 2011

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

В моих тестах я просто делаю вызов типа:

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

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

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

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

Что касается функционального тестирования моего интерфейса, если мне нужно войти, я просто перехожу на страницу входа и отправляю форму согласнотестирование документов.Для того чтобы любой из них работал, вам необходим доступ к контейнеру, поэтому вам нужно расширить 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.
    }

}

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

1 голос
/ 14 декабря 2011

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

Так что вам просто нужно добавить параметр в ваш URL, чтобы просмотреть ваше приложение как другого подключенного пользователя.

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

0 голосов
/ 10 декабря 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...