繁体   English   中英

Symfony 2功能测试:验证自己User类的用户

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM