我正在为使用FOSFacebookBundle(v2.0)的Symfony 2.0应用程序编写symfony功能测试。我正在测试的控制器检查身份验证,如下所示:
if($this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...}
所以我需要对测试的$client
(Symfony\Bundle\FrameworkBundle\Client
类型)进行身份验证。
据说我需要创建一个有效的令牌并在$client
的{{1}},security.context
和session
上设置cookieJar
进行身份验证,对吗?
问题是控制器中的$client
会返回与我在测试security.context
上设置的有效令牌不同的令牌。
有人知道为什么令牌在发出请求后会重置吗?
以下是我在测试用例类中设置它的方法:
$client
完成此设置后,在测试用例中返回use FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider;
use FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken;
use Symfony\Component\BrowserKit\Cookie;
$providerKey = 'public';
$facebookMock = $this->getMockBuilder('\Facebook')
->disableOriginalConstructor()
->getMock();
$facebookMock->expects($this->once())
->method('getUser')
->will($this->returnValue('DevTestUsername'));
$facebookProvider = new FacebookProvider($providerKey, $facebookMock);
$tokenMock = new FacebookUserToken(
'public',
'DevTestUsername',
array('ROLE_MEMBER', 'ROLE_MANAGER', 'ROLE_USER')
);
$authenticatedToken = $facebookProvider->authenticate($tokenMock);
$client->getContainer()->get('security.context')->setToken($authenticatedToken);
$client->getContainer()->get('session')->set('_security_public', serialize($authenticatedToken));
$client->getContainer()->get('session')->save();
$client->getCookieJar()->set(new Cookie(session_name(), $client->getContainer()->get('session')->getId()));
:
true
但是在控制器上,它返回if($client->getContainer()->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...}
false
我在security.context或会话中设置了错误吗?
这是应用程序的安全配置:
if($this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...}
facebook.id服务是一个实现Symfony \ Component \ Security \ Core \ User \ UserProviderInterface的类
这个类使用facebook的php api(BaseFacebook类)来调用facebook图形api(BaseFacebook-> api('/ me')),但这种情况从未发生过,因为我没有超越Symfony的安全性
任何评论,指针或资源链接都非常感谢。谢谢!
答案 0 :(得分:1)
也许最简单的方法是先在Facebook上开设一个开发帐户,然后转到开发网站。最重要的是,你会找到工具。其中之一是“令牌调试器”。它可以为您创建令牌。您还可以复制粘贴调用中获得的令牌之一,该工具将显示令牌的内容。
了解正在发生的事情并查看您获得的令牌是否具有您认为的价值是有用的。
答案 1 :(得分:0)
问题是Symfony 2.0中的错误
我注意到方法中$this->contextKey
等于'primary_auth'
:\Symfony\Component\Security\Http\Firewall\ContextListener::handle(GetResponseEvent $event)
所以在我的测试套件中我做了:
$client->getContainer()->get('session')->set('_security_primary_auth', serialize($authenticatedToken));
而不是
$client->getContainer()->get('session')->set('_security_public', serialize($authenticatedToken));
(此问题记录在此处:https://github.com/symfony/symfony/issues/5228(阅读全文))