如如何在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语句:
use Symfony'Component'Security'Core'Authentication'Token'UsernamePasswordToken;
use Symfony'Bundle'FrameworkBundle'Client;
use Symfony'Component'BrowserKit'Cookie;
是否使用表单登录?或者HTTP安全性?
当使用表单login时,我在测试中所做的是模拟用户通过登录表单登录…
/**
* 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
应该创建必要的用户对象。