我目前正在將2.0。*項目遷移到Symfony當前的2.1測試版。Symfony 2.1中的功能測試中的身份驗證
在我的功能測試,我現在有這樣的代碼來創建一個客戶端身份驗證:
$client = // create a normal test client
$role = 'ROLE_USER';
$firewallName = 'main';
$user = // pull a user from db
$client->getCookieJar()->set(new \Symfony\Component\BrowserKit\Cookie(session_name(), true));
$token = new UsernamePasswordToken($user, null, $firewallName, array($role));
self::$kernel->getContainer()->get('session')->set('_security_' . $firewallName,
serialize($token));
這個工程預期在2.0 *而不是在2.1,該數據不會在會話中設置。
任何想法?
編輯(添加詳細信息):
看來問題就出在文件 「的Symfony \分量\安全\ HTTP \防火牆\ ContextListener」 中的方法 「onKernelResponse」 的。有這樣的代碼:
if ((null === $token = $this->context->getToken()) || ($token instanceof AnonymousToken)) {
$session->remove('_security_'.$this->contextKey);
} else {
$session->set('_security_'.$this->contextKey, serialize($token));
}
在我的情況下,如果「$令牌的instanceof AnonymousToken」是真實的,正因爲如此會話密鑰被刪除。如果我註釋掉代碼,一切都按預期工作。
所以我想我的新問題是:我能做些什麼來使令牌不是匿名的?
我使用的是非常相似的片段,以你的登錄特定功能測試用戶。我也升級到了2.1,並且真的讓我很開心,因爲我的許多功能測試現在都失敗了。 – 2012-08-07 06:05:38
我發現在ContextListener.php中,ac所有的都是$ this-> context-> setToken(null),並且因爲$ session === null而被調用?嗯... – 2012-08-07 06:44:22
當我註釋掉ContextListener.php:第77行 - $ this-> context-> setToken(null)時,我的測試完美無缺!所以也許這是一個線索! – 2012-08-07 06:49:11