gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:57:45 27 4
gpt4 key购买 nike

有人可以解释一下如何在 Controller 中手动创建一个“记住我” cookie吗?

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

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

使用普通模式时,“记住我”功能可以按预期工作
使用用户凭据的登录过程。

安全性
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:

我尝试了第三种方法。与上面相同,但没有进行反射(reflection):
$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);

最佳答案

如果直接设置记住我的cookie,则必须使用以下格式:

base64_encode(<classname>:base64_encode(<username>):<expiry-timestamp>:<hash>)

哈希将在哪里:
sha256(<classname> . <username> . <expiry-timestamp> . <password> . <key>)

该 key 是您在 remember_me部分的安全性(.xml/.yml)中输入的 key 。

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

所有这些都由同一类中的 generateCookieValue()方法完成。

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

关于symfony - 手动创建一个symfony2记住我的cookie(FOSUserBundle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963470/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com