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 クラスを使用すると、正常に動作します。エラー メッセージは非常に誤解を招くものです。