有人可以解釋一下如何在控制器中手動創建一個記住我的cookie?創建一個symfony2手動記住我的cookie(FOSUserBundle)
我希望用戶在按下「註冊」 按鈕後保持登錄狀態,而不必在之後使用憑據登錄。
我試着手動創建一個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被設置,但我使用的Symfony V2.0.5和FOSUserBundle它不工作
$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);
1.0
更新2:
我已經嘗試了3次的方式。與上面相同,但沒有反映:
$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);
對於security.yml越來越餅乾參數和避免重複的原始程序,你應該把它們放在parameters.yml和安全.yml使用%your_parameter_name%調用它們。它們現在可用於安全性和參數 – guillaumepotier
+1爲此使用Symfony2安全類。請記住,remember-me Cookie的默認Cookie名稱是「REMEMBERME」。只有當您使用相同的cookie名稱作爲防火牆時,您纔會通過手動設置cookie進行身份驗證,安全監聽程序將會識別這些cookie。 – flu
傳遞給Symfony \ Bridge \ Doctrine \ Security \ User \ EntityUserProvider :: __ construct()的參數1必須實現接口Doctrine \ Common \ Persistence \ ManagerRegistry,Doctrine \ ORM \ EntityManager的實例,因爲我得到了D: –