2013-07-17 10 views
5

Mam niestandardowego dostawcę użytkownika i jednostkę użytkownika, z których pomyślnie korzystałem w Symfony 2.2. Ale teraz zaktualizowałem do wersji 2.3 i zdałem sobie sprawę, że funkcja "zapamiętaj mnie" jest zepsuta. Stworzyłem więc nową aplikację sf2 i test funkcjonalny. Test przeszedł pomyślnie, gdy użyłem domyślnych ustawień Acme \ DemoBundle. Ale kiedy dodałem mojego dostawcę, zaczęło znowu działać. Tutaj jest test:"Zapamiętaj mnie" test kończy się niepowodzeniem, gdy używany jest niestandardowy dostawca użytkownika, jednostka użytkownika itp.

<?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 = '[email protected]'; 
     $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()); 
    } 
} 

Test działa dobrze, próbowałem sprawdzając je ręcznie za: Loguję się, należy usunąć plik cookie sesji, i starają się uzyskać dostęp do strony zabezpieczona zapamiętaj mnie cookie. Pamiętnik cookie zostanie usunięty i nastąpi przekierowanie do strony logowania: S

Jakieś pomysły, dlaczego tak się dzieje? Mój dostawca nie robi nic dziwnego, po prostu porywa użytkownika z bazy danych jak zwykle. Dlaczego na Ziemi ma to wpływ na funkcjonalność "zapamiętaj mnie"? Czy były jakieś zmiany, o których nie wiem? Nie korzystam z niestandardowego dostawcy auth, tylko dostawca użytkownika.

No i tutaj jest log z bezpieczeństwem grep

[2013-07-17 15:18:49] security.DEBUG: Username "[email protected]" 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 [] [] 

UPDATE: I tylko kiedy wklejony dziennik zauważyłem, że ostrzeżenie. W każdym razie, czy wiesz, jak to naprawić?

AKTUALIZACJA 2: Jeśli korzystam z domyślnego dostawcy usług, ale nadal mam własną klasę użytkownika, działa ona prawidłowo. Komunikat o błędzie jest bardzo mylący.

+0

Czy kiedykolwiek rozwiązałeś to? –

Odpowiedz

1

Spójrz na Symfony\Component\Security\Http\RememberMe\AbstractRememberMeServices.php#L130, skąd pochodzi ostrzeżenie o zabezpieczeniach.

Usługa udostępnia tylko abstrakcyjną metodę, którą można dodać do swojego dostawcy w celu przetworzenia pliku cookie.

+0

Ale nie dotknąłem tego. Nie wdrażam dostawcy uwierzytelniania, a jedynie dostawca usług, aby móc zapisywać/odbierać użytkowników z bazy danych i jednostki użytkownika. Zobacz także moją "aktualizację 2". – ChocoDeveloper

Powiązane problemy