创建一个symfony2手动记住我的cookie(FOSUserBundle)

前端之家收集整理的这篇文章主要介绍了创建一个symfony2手动记住我的cookie(FOSUserBundle)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有人可以解释一下如何在控制器中手动创建记住我的cookie吗?

我希望用户在按下“注册”后保持登录状态
按钮,之后无需使用凭据登录.

我试图手动创建一个cookie,但我猜的是cookie
值不正确,因此“记住我”的功能
不起作用.
设置了具有正确名称的cookie.我检查过了.

使用法线时,记住我的功能按预期工作
使用用户凭据登录过程.

security.yml
security.yml记得我

  1. security:
  2. firewalls:
  3. main:
  4. remember_me:
  5. lifetime: 86400
  6. domain: ~
  7. path: /
  8. key: myKey

这就是我现在所拥有的,即使设置了cookie,它也不起作用.

  1. $um = $this->get('fos_user.user_manager');
  2. $member = $um->createUser();
  3.  
  4. Form stuff with bindRequest etc.
  5.  
  6. $um->updatePassword($member);
  7. $um->updateUser($member);
  8.  
  9. $providerKey = $this->container->getParameter('fos_user.firewall_name');
  10. $securityKey = 'myKey';
  11.  
  12. $token = new RememberMeToken($member,$providerKey,$securityKey,$member->getRoles());
  13. $this->container->get('security.context')->setToken($token);
  14.  
  15. $redirectResponse = new RedirectResponse($url);
  16. $redirectResponse->headers->setCookie(
  17. new \Symfony\Component\HttpFoundation\Cookie(
  18. 'REMEMBERME',base64_encode(implode(':',array($member->getUsername(),$member->getPassword()))),time() + 60*60*24
  19. )
  20. );
  21. return $redirectResponse;

更新:

我也尝试过使用
PersistentTokenBasedRememberMeServices类具有反射但它不起作用.一个cookie被设置但它不起作用

  1. $token = $this->container->get('security.context')->getToken();
  2.  
  3. $providerKey = $this->container->getParameter('fos_user.firewall_name');
  4. $securityKey = 'myKey';
  5.  
  6. $persistenService = new
  7. PersistentTokenBasedRememberMeServices(array($um),array('path' => '/','name' => 'REMEMBERME','domain' =>
  8. null,'secure' => false,'httponly' => true,'lifetime' => 86400));
  9. $persistenService->setTokenProvider(new InMemoryTokenProvider());
  10.  
  11. $method = new \ReflectionMethod('Symfony\Component\Security\Http\RememberMe\PersistentTokenBasedRememberMeServices','onLoginSuccess');
  12. $method->setAccessible(true);
  13. $method->invoke($persistenService,$request,$redirectResponse,$token);

我正在使用Symfony v2.0.5和FOSUserBundle 1.0

更新2:

我尝试了第三种方式.与上述相同但没有反思:

  1. $token = $this->container->get('security.context')->getToken();
  2.  
  3. $providerKey = $this->container->getParameter('fos_user.firewall_name');
  4. $securityKey = 'myKey';
  5.  
  6. $persistenService = new PersistentTokenBasedRememberMeServices(array($um),'domain' => null,'lifetime' => 31536000,'always_remember_me' => true,'remember_me_parameter' => '_remember_me'));
  7. $persistenService->setTokenProvider(new InMemoryTokenProvider());
  8.  
  9. $persistenService->loginSuccess($request,$token);

解决方法

如果要直接设置记忆cookie,则必须使用以下格式:
  1. base64_encode(<classname>:base64_encode(<username>):<expiry-timestamp>:<hash>)

哈希将在哪里:

  1. sha256(<classname> . <username> . <expiry-timestamp> . <password> . <key>)

密钥是您在remember_me部分中输入安全性(.xml / .yml)的密钥.

这取自Symfony / Component / Security / Http / RememberMe / TokenBasedRememberMeService.PHP文件中的processAutoLoginCookie()方法.

这都是由同一个类中的generateCookieValue()方法完成的.

但是,我不建议直接使用这种方式,但是尝试查看是否可以调用TokenBasedRememberMeService :: onLoginSuccess()方法,该方法为您设置此cookie以使代码更加健壮和可移植.

猜你在找的HTML相关文章