记住我不工作
Remember me not working
在我的 symfony2 应用程序中,我尝试使用默认启用的 "Remember me" 功能登录用户。 cookie 设置正确,但用户仍会在一段时间后注销(我会说大约一个小时)。这发生在我的开发机器、暂存和生产版本上。
security.yml:
firewalls:
default:
pattern: ^/
anonymous: ~
form_login:
login_path: frontend_user_login
check_path: frontend_user_loginCheck
username_parameter: user[email]
password_parameter: user[password]
remember_me: true
logout:
path: frontend_user_logout
remember_me:
key: "%secret%"
lifetime: 31536000 # 365 days in seconds
path: /
domain: ~ # Defaults to the current domain from $_SERVER
config.yml:
framework:
session:
cookie_lifetime: 31536000
cookie_httponly: true
handler_id: ~
name: mycookie
在 Chrome 中查看我的 cookie,它显示:
Name: mycookie
Content: hqafha2ut4rpl4bdnh2jhcfm34
Domain: REPLACED
Path: /
Send for: Any kind of connection
Accessible to script: No (HttpOnly)
Created: Thursday, January 8, 2015 at 10:46:36 PM
Expires: Friday, January 8, 2016 at 10:46:36 PM
我使用 php.ini 中的 session.save_handler = redis
设置将我的会话存储在 redis 中。这个问题在我换成redis之前确实存在,而且过程中没有改变,所以我认为不是问题所在?
还有什么我想念的吗?可能有一些我需要注意的 php.ini 配置?
我认为这行会对您有所帮助(只需将其添加到您的登录表单):
// ../path/to/login.html.twig
<input type="hidden" name="_remember_me" value="1" />
虽然 Jay 的回答对我有用,但我想回答我自己的问题并详细介绍记住我和会话生命周期的所有不同配置。
记住我
login_form
有一个 remember_me
键(参见我上面的问题),但它并没有像我想的那样工作。我仍然不确定它到底做了什么,但这并不意味着登录总是假定 remember_me 已激活。
相反,将 always_remember_me: true
放入 security.yml
中的 remember_me
配置中就可以了。将创建名为 REMEMBERME
的第二个 cookie,用于在会话超时时让用户登录。
添加名称为 _remember_me
、值为 1
的隐藏输入字段同样有效。
会话生命周期
要在您的 symfony 应用程序中更改会话生命周期,您可以直接更改 php.ini 中的值或在 config.yml
.
中定义这些值
两种方式,您需要编辑的值为gc_maxlifetime
。更改 php.ini 中的值或将其添加到 config.yml
中的 framework
-> session
部分,如下所述:http://symfony.com/doc/current/reference/configuration/framework.html#gc-maxlifetime
我选择更改配置中的值,因为这样可以使 dev/staging/production 保持不变,而且我不需要弄乱不同的 php.ini
文件。
在我的 symfony2 应用程序中,我尝试使用默认启用的 "Remember me" 功能登录用户。 cookie 设置正确,但用户仍会在一段时间后注销(我会说大约一个小时)。这发生在我的开发机器、暂存和生产版本上。
security.yml:
firewalls:
default:
pattern: ^/
anonymous: ~
form_login:
login_path: frontend_user_login
check_path: frontend_user_loginCheck
username_parameter: user[email]
password_parameter: user[password]
remember_me: true
logout:
path: frontend_user_logout
remember_me:
key: "%secret%"
lifetime: 31536000 # 365 days in seconds
path: /
domain: ~ # Defaults to the current domain from $_SERVER
config.yml:
framework:
session:
cookie_lifetime: 31536000
cookie_httponly: true
handler_id: ~
name: mycookie
在 Chrome 中查看我的 cookie,它显示:
Name: mycookie
Content: hqafha2ut4rpl4bdnh2jhcfm34
Domain: REPLACED
Path: /
Send for: Any kind of connection
Accessible to script: No (HttpOnly)
Created: Thursday, January 8, 2015 at 10:46:36 PM
Expires: Friday, January 8, 2016 at 10:46:36 PM
我使用 php.ini 中的 session.save_handler = redis
设置将我的会话存储在 redis 中。这个问题在我换成redis之前确实存在,而且过程中没有改变,所以我认为不是问题所在?
还有什么我想念的吗?可能有一些我需要注意的 php.ini 配置?
我认为这行会对您有所帮助(只需将其添加到您的登录表单):
// ../path/to/login.html.twig
<input type="hidden" name="_remember_me" value="1" />
虽然 Jay 的回答对我有用,但我想回答我自己的问题并详细介绍记住我和会话生命周期的所有不同配置。
记住我
login_form
有一个 remember_me
键(参见我上面的问题),但它并没有像我想的那样工作。我仍然不确定它到底做了什么,但这并不意味着登录总是假定 remember_me 已激活。
相反,将 always_remember_me: true
放入 security.yml
中的 remember_me
配置中就可以了。将创建名为 REMEMBERME
的第二个 cookie,用于在会话超时时让用户登录。
添加名称为 _remember_me
、值为 1
的隐藏输入字段同样有效。
会话生命周期
要在您的 symfony 应用程序中更改会话生命周期,您可以直接更改 php.ini 中的值或在 config.yml
.
两种方式,您需要编辑的值为gc_maxlifetime
。更改 php.ini 中的值或将其添加到 config.yml
中的 framework
-> session
部分,如下所述:http://symfony.com/doc/current/reference/configuration/framework.html#gc-maxlifetime
我选择更改配置中的值,因为这样可以使 dev/staging/production 保持不变,而且我不需要弄乱不同的 php.ini
文件。