5

Symfony 2.2 で正常に使用したカスタム ユーザー プロバイダーとユーザー エンティティがあります。しかし、2.3 にアップグレードしたところ、"remember me" 機能が壊れていることに気付きました。そこで、新しい sf2 アプリと機能テストを作成しました。Acme\DemoBundle のデフォルトを使用すると、テストに合格しました。しかし、プロバイダーを追加すると、再び失敗し始めました。テストは次のとおりです。

<?php

namespace Acme\DemoBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\BrowserKit\Cookie;

class DemoControllerTest extends WebTestCase
{
    public function testRemember()
    {
        $client = static::createClient();

        $securedPageUri = '/user/settings/account';
        $securedPageFilter = 'html:contains("New Password")';
        $loginPageFilter = 'html:contains("Login")';
        $username = 'test@test.com';
        $password = 'test';
        /*
        $securedPageUri = '/demo/secured/hello/World';
        $securedPageFilter = 'html:contains("Hello resource secured for admin only.")';
        $loginPageFilter = 'html:contains("Login")';
        $username = 'admin';
        $password = 'adminpass';
        */

        // Go to Secured page, and be redirected to Login page
        $client->request('GET', $securedPageUri);
        $crawler = $client->followRedirect();
        $this->assertGreaterThan(0, $crawler->filter($loginPageFilter)->count());

        // Try to log in, and be redirected to Secured page
        $form = $crawler->selectButton('Login')->form();
        $form['_username'] = $username;
        $form['_password'] = $password;
        $form['_remember_me'] = 1;
        $client->submit($form);
        $crawler = $client->followRedirect();
        $this->assertGreaterThan(0, $crawler->filter($securedPageFilter)->count());

        // Remove all the cookies, but keep the "remember me" cookie
        $remembermeCookie = $client->getCookieJar()->get('REMEMBERME');
        $client->restart();
        $client->getCookieJar()->set($remembermeCookie);

        // Go to Secured page, this time we should be allowed in
        $client->followRedirects();
        $crawler = $client->request('GET', $securedPageUri);
        //$this->assertTrue($client->getResponse()->isSuccessful());
        $this->assertEquals(0, $crawler->filter($loginPageFilter)->count(), "Redirected to Login page"); // THIS IS WHERE THE TEST FAILS
        $this->assertGreaterThan(0, $crawler->filter($securedPageFilter)->count());
    }
}

テストは正常に動作します。私も手動でテストしてみました。ログインして、セッション Cookie を削除し、remember me Cookie を使用して保護されたページにアクセスしようとしました。覚えている Cookie が削除され、ログイン ページにリダイレクトされます:S

なぜこれが起こっているのでしょうか?私のプロバイダーは何も変なことはしません。いつものようにデータベースからユーザーを取得するだけです。なぜこれが「記憶」機能に影響を与えるのでしょうか? 私が気付いていない変化はありましたか?私はカスタム認証プロバイダーを使用しておらず、ユーザー プロバイダーのみを使用しています。

ああ、これがgrepセキュリティ付きのログです

[2013-07-17 15:18:49] security.DEBUG: Username "test@test.com" was reloaded from user provider. [] []
[2013-07-17 15:18:49] security.DEBUG: Write SecurityContext in the session [] []
[2013-07-17 15:18:49] security.DEBUG: Remember-me cookie detected. [] []
[2013-07-17 15:18:49] security.WARNING: User class for remember-me cookie not supported. [] []
[2013-07-17 15:18:49] security.DEBUG: Clearing remember-me cookie "REMEMBERME" [] []
[2013-07-17 15:18:49] security.INFO: Populated SecurityContext with an anonymous Token [] []
[2013-07-17 15:18:49] security.DEBUG: Access is denied (user is not fully authenticated) by "/srv/www/dev/public/remember/vendor/symfony/symfony/src/Symfony/Component/Security/Http/Firewall/AccessListener.php" at line 73; redirecting to authentication entry point [] []
[2013-07-17 15:18:49] security.DEBUG: Calling Authentication entry point [] []
[2013-07-17 15:18:49] security.DEBUG: Write SecurityContext in the session [] []
[2013-07-17 15:18:49] security.INFO: Populated SecurityContext with an anonymous Token [] []
[2013-07-17 15:18:49] security.DEBUG: Write SecurityContext in the session [] []

更新:そして、ログを貼り付けたときにのみ、その警告に気付きました。とにかく、それを修正する方法を知っていますか?

更新 2 : デフォルトのユーザー プロバイダーを使用しても、独自の User クラスを使用すると、正常に動作します。エラー メッセージは非常に誤解を招くものです。

4

1 に答える 1