我正在尝试测试一个API调用方法,该方法使用Basic Auth进行安全化,并且需要从安全上下文中检索用户。
我的config_test.yml文件(我在测试环境中使用内存数据库):
imports:
- { resource: config_dev.yml }
doctrine:
dbal:
driver: pdo_sqlite
path: :memory:
memory: true
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
framework:
test: ~
session: ~
profiler:
enabled: false
web_profiler:
toolbar: false
intercept_redirects: false
swiftmailer:
disable_delivery: true
我已经创建了一个测试,我按如下方式实例化客户端:
$options = array(
'environment' => 'test',
'debug' => true,
);
$this->client = static::createClient($options);
测试看起来像:
public function testProfileAction()
{
$mockUser = new User();
$mockUser->setUsername("user");
$mockUser->setEmail("user@user.com");
$mockUser->setName("User");
$mockUser->setSurname("User");
$mockUser->setPlainPassword("1234567890");
$this->em->persist($mockUser);
$this->em->flush();
$crawler = $this->client->request('GET', '/api/1/user/profile', array(), array(), array(
'PHP_AUTH_USER' => 'user',
'PHP_AUTH_PW' => '1234567890',
));
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}
该方法需要从安全上下文中获取用户。
$user = $this->get('security.context')->getToken()->getUser();
但是,运行测试我总是得到401而不是200.在方法中转储$ user变量始终为null。
我正在使用Symfony 2.2和FOSUserBundle。
提前致谢。
答案 0 :(得分:5)
我遇到了同样的问题。正如@nifr所说,你必须创建令牌,但你也需要序列化它并创建cookie。我就是这样做的。
$token = new UsernamePasswordToken($mockUser, null, $firewallName, array($role));
self::$kernel->getContainer()->get('security.context')->setToken($token);
self::$kernel->getContainer()->get('session')->set('security'.$firewallName, serialize($token));
self::$kernel->getContainer()->get('session')->save();
$cookie = new Cookie(self::$kernel->getContainer()->get('session')->getName(), self::$kernel->getContainer()->get('session')->getId());
$this->client->getCookieJar()->set($cookie);
答案 1 :(得分:0)
您必须先创建令牌才能从安全上下文中访问它。
$firewallName = 'main';
$role = 'ROLE_USER';
$token = new UsernamePasswordToken($user, null, $firewallName, array($role));
self::$kernel->getContainer()->get('security.context')->setToken($token);
适用于here的案例。