Symfony test - аутентифицированный не работает по новому запросу

Good morning. 

Tldr: я думаю, что мне нужно для тестового клиента Symfony что-то похожее на настройки js xhr: withcredentals:true.

Symfony 3.1. I have action in rest api controller:

    /**
     * @Rest\GET("/get-stuff")
     * @Rest\View
     * @Security("is_granted('IS_AUTHENTICATED_FULLY')")
     */
    public function GetStuffAction($userId)
    {
        // get userId from session
        $userId = $this->getUser()->getId();
        $em = $this->getDoctrine()->getManager();
        $Stuff = $em->getRepository('MyApiBundle:Stuff')->findBy(['user' => $userId]);
        return $this->viewGroup($Stuff, ['stuff']);
    }    

И работает корректно.

Теперь я хочу Test, поэтому у меня есть:

    class TestCase extends WebTestCase
    {
         public function testIndex()
         {
            $this->client = self::createClient();
            $this->storage = new MockFileSessionStorage(__dir__.'/../../../../app/cache/test/sessions');
            $this->session = new Session($this->storage);
            $this->logIn($this->getUser(), new Response());
            $this->client->request('GET', '/get-stuff');
            $content = $this->client->getResponse()->getContent();
            $this->assertEquals({"message":"Full authentication is required to access this resource.","code":0},$content);
    }

        public function logIn(User $user, Response $response) 
        {
             $this->session->start();
             $this->cookie = new Cookie('MOCKSESSID', $this->storage->getId());
             $this->cookieJar = new CookieJar();
             $this->cookieJar->set($this->cookie);
             $this->token = new UsernamePasswordToken($user, 'user', 'main', $user->getRoles());
             $this->session->set('_security_main', serialize($this->token));


             $this->getSecurityManager()->loginUser(
                 $this->container->getParameter('fos_user.firewall_name'),
                 $user,
                 $response
             );

             $this->session->save();
         }
    }

И тест на это дает мне сообщение: «Для доступа к этому ресурсу требуется полная аутентификация». После метода logIn() я могу читать данные сеанса, которые связаны с зарегистрированным пользователем. Как я могу войти в систему во время этой части, чтобы не получать сообщение об аутентификации?:

$this->client->request('GET', '/get-stuff');
        $content = $this->client->getResponse()->getContent();

Подробнее: 1. Мой тестовый класс расширяет WebTestCase. 2. Мой пользователь перезаписан для FosUserBundle.

Я предполагаю, что это что-то вроде javascript: var xhr = new XMLHttpRequest(); xhr.withCredentials = истина; но я не знаю что.

Заранее благодарю за помощь в решении моей проблемы!


person szpakucjusz    schedule 16.08.2017    source источник


Ответы (1)


Хорошо, я был хорошим способом сделать это:

публичная функция logIn(User $user) { $session = $this->session;

    $firewallContext = 'secured_area';

    $token = new UsernamePasswordToken($user, 'user', 'main', $user->getRoles());
    $session->set('_security_'.$firewallContext, serialize($token));
    $session->save();

    $cookie = new Cookie($session->getName(), $session->getId());
    $this->client->getCookieJar()->set($cookie);
}
person szpakucjusz    schedule 24.08.2017