[英]Symfony 2 functional test: authenticate user of own User class
如回答如何在Symfony2功能測試中使用經過身份驗證的用戶中所述? Symfony\\Component\\Security\\Core\\User\\User
有一個簡單的解決方案。
但我有不同的User類(一些必要的附加字段),我想用它來驗證用戶。
我該如何為它設置提供者?
這是一個棘手的問題: https : //github.com/symfony/symfony/issues/5228雖然它是2.1,但我仍然使用2.2。
以下是我如何進行測試認證:
// 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..
哦,和使用聲明:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Component\BrowserKit\Cookie;
你使用表格登錄嗎? 還是http安全?
當我使用表格登錄我在測試中做的是我只是模擬通過登錄表單登錄的用戶...
/**
* 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());
}
然后只使用該客戶端和爬蟲,因為他們將充當登錄用戶。 希望這對你有所幫助
您可能還會發現這些有用,尤其是在您使用表單登錄時
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,
)
);
}
我找到了解決方案。
首先,我們必須創建新的用戶提供: FakeUserProvider
描述這里 。
它應該實現UserProviderInterface
。
其loadUserByUsername
應創建必要的用戶對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.