/ / Test funkcjonalny Symfony 2: uwierzytelnienie użytkownika własnej klasy użytkownika - php, bezpieczeństwo, testowanie, symfony, phpunit

Test funkcjonalny Symfony 2: uwierzytelnianie użytkownika z własnej klasy użytkownika - php, bezpieczeństwo, testowanie, symfony, phpunit

Jak opisano w odpowiedzi na Jak korzystać z uwierzytelnionego użytkownika w teście funkcjonalnym Symfony2? istnieje proste rozwiązanie z SymfonyComponentSecurityCoreUserUser.

Ale mam inną klasę użytkownika (niektóre niezbędne pola dodatkowe) i chcę za jej pomocą uwierzytelnić użytkownika.

Jak mogę skonfigurować do tego dostawców?

Odpowiedzi:

11 dla odpowiedzi nr 1

Jest to trudny problem omówiony tutaj: https://github.com/symfony/symfony/issues/5228 Chociaż jest to 2.1, nadal przydarza mi się używanie 2.2.

Oto jak wykonuję uwierzytelnianie testowe:

// Create a new client to browse the application
$client = static::createClient();
$client->getCookieJar()->set(new Cookie(session_name(), true));

// dummy call to bypass the hasPreviousSession check
$crawler = $client->request("GET", "/");

$em = $client->getContainer()->get("doctrine")->getEntityManager();
$user = $em->getRepository("MyOwnBundle:User")->findOneByUsername("username");

$token = new UsernamePasswordToken($user, $user->getPassword(), "main_firewall", $user->getRoles());
self::$kernel->getContainer()->get("security.context")->setToken($token);

$session = $client->getContainer()->get("session");
$session->set("_security_" . "main_firewall", serialize($token));
$session->save();

$crawler = $client->request("GET", "/login/required/page/");

$this->assertTrue(200 === $client->getResponse()->getStatusCode());

// perform tests in the /login/required/page here..

Aha, a instrukcje użytkowania:

use SymfonyComponentSecurityCoreAuthenticationTokenUsernamePasswordToken;
use SymfonyBundleFrameworkBundleClient;
use SymfonyComponentBrowserKitCookie;

1 dla odpowiedzi nr 2

używasz formularza logowania? lub http security?

kiedy korzystam z formularza logowania, to co robię w moich testach, to po prostu symuluję logowanie się użytkownika za pomocą formularza logowania ...

    /**
* test of superuser ingelogd geraakt
*/
public function testSuperAdminLogin()
{
$crawler = $this->client->request("GET", "/login");
$form = $crawler->selectButton("Sign In")->form();
$user = $this->em->getRepository("NonoAcademyBundle:User")
->findOneByUsername("superadmin");
$crawler = $this->client
->submit($form,
array("_username" => $user->getUsername(),
"_password" => $user->getPassword()));

$this->assertTrue($this->client->getResponse()->isSuccessful());

$this
->assertRegExp("//admin/notifications/",
$this->client->getResponse()->getContent());
}

następnie po prostu użyj tego klienta i przeszukiwacza, ponieważ będą działać jako zalogowani użytkownicy. Mam nadzieję, że to ci pomoże


0 dla odpowiedzi № 3

Znalazłem rozwiązanie.

Najpierw musimy utworzyć nowego dostawcę użytkowników: FakeUserProvider jak w opisie tutaj.
Powinien zostać wdrożony UserProviderInterface.

Jego loadUserByUsername powinien utworzyć niezbędny obiekt użytkownika.


0 dla odpowiedzi nr 4

Mogą być również pomocne, szczególnie jeśli używasz formularza logowania

private function doLogin()
{
$this->client = static::createClient();
$username = "your-username";
$password = "your-password";

$crawler = $this->client->request("GET", "/login");
$form = $crawler->filter("your-submit-button-classname")->form();

$crawler = $this->client
->submit($form,
array(
"_username" => $username,
"_password" => $password,
)
);
}