Czy ktoś mógłby wyjaśnić, w jaki sposób możesz ręcznie utworzyć plik cookie "zapamiętaj mnie" w kontrolerze?Utwórz plik cookie symfony2 pamiętaj mnie ręcznie (FOSUserBundle)
Chcę, aby użytkownicy pozostali zalogowani po naciśnięciu przycisku "zarejestruj się" pod numerem , bez konieczności późniejszego logowania za pomocą swoich danych uwierzytelniających.
Próbowałem ręcznie utworzyć plik cookie, ale domyślam się, że wartość cookie jest niepoprawna, dlatego funkcja "zapamiętaj mnie" nie działa. Zostanie ustawiony plik cookie o poprawnej nazwie. Sprawdziłem to.
Funkcja zapamiętaj mnie działa zgodnie z oczekiwaniami podczas korzystania z normalnej procedury logowania przy użyciu poświadczeń użytkownika.
security.yml security.yml zapamiętaj
security:
firewalls:
main:
remember_me:
lifetime: 86400
domain: ~
path: /
key: myKey
To jest to, co mam teraz, mimo że plik cookie jest ustawiony, to nie działa.
$um = $this->get('fos_user.user_manager');
$member = $um->createUser();
… Form stuff with bindRequest etc.
$um->updatePassword($member);
$um->updateUser($member);
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$securityKey = 'myKey';
$token = new RememberMeToken($member, $providerKey, $securityKey,
$member->getRoles());
$this->container->get('security.context')->setToken($token);
$redirectResponse = new RedirectResponse($url);
$redirectResponse->headers->setCookie(
new \Symfony\Component\HttpFoundation\Cookie(
'REMEMBERME',
base64_encode(implode(':', array($member->getUsername(),
$member->getPassword()))),
time() + 60*60*24
)
);
return $redirectResponse;
Aktualizacja:
Próbowałem zostały również pracować z klasą PersistentTokenBasedRememberMeServices z refleksji, ale to nie działa. ciasteczko zostanie ustawiona, ale to nie działa
$token = $this->container->get('security.context')->getToken();
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$securityKey = 'myKey';
$persistenService = new
PersistentTokenBasedRememberMeServices(array($um), $providerKey,
$securityKey, array('path' => '/', 'name' => 'REMEMBERME', 'domain' =>
null, 'secure' => false, 'httponly' => true,
'lifetime' => 86400));
$persistenService->setTokenProvider(new InMemoryTokenProvider());
$method = new \ReflectionMethod('Symfony\Component\Security\Http\RememberMe\PersistentTokenBasedRememberMeServices',
'onLoginSuccess');
$method->setAccessible(true);
$method->invoke($persistenService, $request, $redirectResponse, $token);
Używam Symfony v2.0.5 i FOSUserBundle 1,0
UPDATE 2:
Próbowałem 3rd drogę. Tak samo jak powyżej, ale bez refleksji:
$token = $this->container->get('security.context')->getToken();
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$securityKey = 'myKey';
$persistenService = new PersistentTokenBasedRememberMeServices(array($um), $providerKey, $securityKey, array('path' => '/', 'name' => 'REMEMBERME', 'domain' => null, 'secure' => false, 'httponly' => true, 'lifetime' => 31536000, 'always_remember_me' => true, 'remember_me_parameter' => '_remember_me'));
$persistenService->setTokenProvider(new InMemoryTokenProvider());
$persistenService->loginSuccess($request, $redirectResponse, $token);
Dla uzyskania parametrów cookie w security.yml i uniknąć duplikatów, należy umieścić je w parameters.yml i bezpieczeństwa .yml wywołaj je za pomocą% twoja_nazwa_parametru%. Są teraz dostępne w zabezpieczeniach i parametrach – guillaumepotier
+1 Do korzystania z klas bezpieczeństwa Symfony2. Należy pamiętać, że domyślną nazwą pliku cookie "Remember Me" jest "REMEMBERME". Tylko wtedy, gdy użyjesz tej samej nazwy pliku cookie, co firewall, którego autentykacja dotyczy Twojego ręcznego ustawienia ciasteczka, zostanie rozpoznany przez program nasłuchujący. – flu
Argument 1 przekazany do Symfony \ Bridge \ Doctrine \ Security \ User \ EntityUserProvider :: __ construct() musi zaimplementować interfejs Doctrine \ Common \ Persistence \ ManagerRegistry, instancja Doctrine \ ORM \ EntityManager podana Mam to D: –