0

FOSFacebookBundle (v2.0) を使用する Symfony 2.0 アプリケーションの symfony 機能テストを作成しています。私がテストしているコントローラーは、次のように認証をチェックします。

if($this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...}

したがって、$client(タイプのSymfony\Bundle\FrameworkBundle\Client) テストを認証する必要があります。

おそらく、有効なトークンを作成し、それを、、およびforに設定して認証する必要がありますよね$client?security.contextsessioncookieJar$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

if($this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...}

security.context またはセッションで間違った設定をしていますか?

アプリケーションのセキュリティ構成は次のとおりです。

security:
    factories:
        - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml"

    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       [ROLE_USER, ROLE_ALLOWED_TO_SWITCH]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN]

    providers:
        chain_provider:
            providers: [fos_userbundle, facebook_provider]
        fos_userbundle:
            id: fos_user.user_manager
        facebook_provider:
            id: facebook.user

    firewalls:
        public:
            pattern:   ^/.*
            fos_facebook:
                provider: facebook_provider
                app_url: "http://apps.facebook.com/myapp"
                server_url: "http://myapp.local/"
                login_path: /login
                check_path: /login_check
                default_target_path: /target
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                login_path: /login
                check_path: /login_check
            anonymous: true
            switch_user: { role: ROLE_ADMIN }
            logout:
                target: http://myapp.com
                handlers: ["fos_facebook.logout_handler"]
            context: primary_auth

facebook.id サービスは Symfony\Component\Security\Core\User\UserProviderInterface を実装するクラスです

このクラスは Facebook の php API (BaseFacebook クラス) を使用して Facebook グラフ API (BaseFacebook->api('/me')) を呼び出しますが、Symfony のセキュリティを通過しないため、これは決して起こりません。

リソースへのコメント、ポインタ、またはリンクは大歓迎です。ありがとう!

4

2 に答える 2

1

おそらく最も簡単な方法は、Facebook で開発者アカウントを開設してから、開発者の Web サイトにアクセスすることです。その上に、ツールがあります。それらの 1 つが「トークン デバッガー」です。トークンを作成できます。呼び出しで取得したトークンの 1 つをコピーして貼り付けることもできます。ツールはトークンの内容を表示します。

何が起こっているのかを理解し、取得したトークンに自分が思っている価値があるかどうかを確認することは役に立ちます。

于 2014-09-03T21:51:34.080 に答える
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 (すべてを読んでください))

于 2014-09-05T09:21:26.597 に答える