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 1Jest 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,
)
);
}