2017-08-16 4 views
0
Good morning. 

tldr: Je pense que, j'ai besoin de quelque chose Symfony Test client similaire à js paramètres XHR: withcredentals: true.test de symfony - ne fonctionne pas authentifié sur la nouvelle demande

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']); 
    }  

Et cela fonctionne correctement.

Maintenant, je veux test, j'ai donc:

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(); 
     } 
    } 

Et test il me donne un message: "authentification complète est nécessaire pour accéder à cette ressource". Après la méthode logIn(), je peux lire les données de session qui sont connectées avec l'utilisateur connecté. Comment puis-je faire pour être connecté au cours de cette partie pour ne pas recevoir un message sur l'authentification ?:

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

Plus de détails: 1. Ma classe de test extends WebTestCase. 2. Mon utilisateur est remplacé par FosUserBundle.

Je suppose que c'est quelque chose comme en javascript: var xhr = new XMLHttpRequest(); xhr.withCredentials = true; mais je ne sais pas quoi.

Merci d'avance d'aider à résoudre mon problème!

Répondre

0

Ok, je suis bonne façon de le faire:

fonction publique LOGIN (utilisateur $ 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); 
}