【问题标题】:User token in Symfony2 Functional TestsSymfony2 功能测试中的用户令牌
【发布时间】:2015-07-31 12:45:40
【问题描述】:

我正在对 Symfony2 控制器进行功能测试,从这里继承我的测试类:

class InsecureWebTestCase extends WebTestCase {

    protected $client = null;

    public function setUp() {
        $this->client = static::createClient();
        $session = $this->client->getContainer()->get('session');
        $firewall = 'default';
        $token = new UsernamePasswordToken('norbert.scrunge@gmail.com', null, $firewall, array('ROLE_USER', 'ROLE_ADMIN'));
        // $this->client->getContainer()->get('security.context')->setToken($token);
        $session->set("_security_$firewall", serialize($token));
        $session->save();
        $cookie = new Cookie($session->getName(), $session->getId());
        $this->client->getCookieJar()->set($cookie);
    }

}

如果我将控制器用作应用程序的一部分: $this->container->get('security.token_storage')->getToken()->getUser()$this->getUser() 是我的 Doctrine “用户”实体的实例。

但是在运行功能测试时: $this->container->get('security.token_storage')->getToken()->getUser() 是包含用户名的字符串,$this->getUser()NULL

我需要做些什么来使我的应用和功能测试中的行为保持一致?

【问题讨论】:

  • 在执行请求时尝试这种方式:$client->request('GET', '/post/12', array(), array(), array( 'PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'pa$$word', ));

标签: php symfony functional-testing security-context


【解决方案1】:

查看 UsernamePasswordToken 来源:

class UsernamePasswordToken extends AbstractToken
{

    /**
     * Constructor.
     *
     * @param string|object            $user        The username (like a nickname, email address, etc.), or a UserInterface instance or an object implementing a __toString method.
     * @param string                   $credentials This usually is the password of the user
     * @param string                   $providerKey The provider key
     * @param RoleInterface[]|string[] $roles       An array of roles
     *
     * @throws \InvalidArgumentException
     */
    public function __construct($user, $credentials, $providerKey, array $roles = array())

尤其是 $user 参数描述

@param string|object $user 用户名(如 昵称、电子邮件地址等),或 UserInterface 实例或 对象

因此,使用应用程序时,您将在那里传递一个用户实体作为 $user 参数,但您在测试时传递了电子邮件字符串。

所以第一种方法是创建新的用户对象并用一些测试数据填充它或从其存储库中获取特定用户,例如:

$user = $client->getContainer()->get('doctrine')->getManager()->getRepository('MyAppUserBundle:User')->findOneByEmail('norbert.scrunge@gmail.com');
$token = new UsernamePasswordToken($user, null, $firewall, array('ROLE_USER', 'ROLE_ADMIN'));

【讨论】:

  • 那么简单的答案...只需将模拟或真实用户对象传递给UsernamePasswordToken 构造函数,而不仅仅是用户名(如 Symfony2 文档中所建议的那样)
  • 我在这里尝试了相同的解决方案,我正在访问 eventSubscriber getUser() 中的登录用户,给 null 任何建议
猜你喜欢
  • 2019-06-11
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多