Может кто-нибудь объяснить, как вы можете вручную создать файл cookie «запомнить меня» в контроллере?
Я хочу, чтобы пользователи оставались авторизованными после того, как нажали «регистр» кнопку, без необходимости впоследствии входить в систему с их учетными данными.
Я пытался создать файл cookie вручную, но предполагаю, что это файл cookie значение неверно, поэтому функция «запомнить меня» не работает. Устанавливается файл cookie с правильным именем. Я это проверил.
Функция «запомнить меня» работает должным образом при использовании обычного процедура входа в систему с учетными данными пользователя.
security.yml security.yml запомни меня
security:
firewalls:
main:
remember_me:
lifetime: 86400
domain: ~
path: /
key: myKey
Это то, что у меня есть сейчас, хотя cookie установлен, он не работает.
$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;
Обновление:
Я также пробовал работать с PersistentTokenBasedRememberMeServices с отражением, но он не работает. cookie устанавливается, но не работает
$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);
Я использую Symfony v2.0.5 и FOSUserBundle 1.0
ОБНОВЛЕНИЕ 2:
Я пробовал третий способ. То же, что и выше, но без отражения:
$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);