我在文件“ security.yml ”中使用了密钥“ remember_me” ,以便使用Symfony的Remember_me功能。我已经使用了一个星期的生命(请在下面查看我的security.yml文件)。我正在使用Symfony 2.8.48版和friendsofsymfony / user-bundle版本2.0.1。
因此,当我通过登录表单成功登录后, REMEMBERME cookie设置正确,我可以在导航器上看到 >(google Chrome),并在一周后正确设置了 Expires / Max-Age (在屏幕截图中,自从10月31日登录以来,该时间在11月7日到期)。
但是在关闭我的网站页面的标签后一两个小时,如果我回到自己的网站,尽管 REMEMBERME cookie仍然出现在导航器上,我已经断开连接。
那怎么可能?为什么Remember_me功能不起作用?我通过以下链接遵循了Symfony文档上的确切设置:
https://symfony.com/doc/2.8/security/remember_me.html
在我的登录表单中,我还以复选框的形式添加了名称为“ remember_me”的输入(请查看下面的代码段)
这与我的文件config.yml中的session参数有关吗?它与cookie_lifetime参数有关吗?
此外,如果我要调查,应该从哪里开始。在Symfony中触发了“检查是否有一个Remember_me cookie”信息,什么处理程序会自动检查是否有一个Remember_me cookie?
谢谢。
我的security.yml文件
main_firewall:
pattern: ^/
anonymous: false
context: general_context
entry_point: my_custom_authentication_entry_point
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
default_target_path: my_custom_target_path
use_forward: false
use_referer: true
post_only: true
username_parameter: _username
password_parameter: _password
success_handler: my_custom_handler
failure_handler: my_custom_handler
require_previous_session: false
csrf_token_generator: security.csrf.token_manager
logout: true
remember_me:
secret: '%secret%'
lifetime: 604800
path: /
always_remember_me: true
我的config.yml文件(仅会话部分):
framework:
session:
# handler_id set to null will use default session handler from php.ini
handler_id: ~
我的login.html.twig(此问题的简化版本):
<form action="{{ path("fos_user_security_check") }}" method="post">
<h2>{{ 'login.label.email'|trans }}</h2>
<input id="email" type="email" name="_username" placeholder="{{ 'login.placeholder.email'|trans }}">
<h2>{{ 'login.label.password'|trans }}</h2>
<input id="password" class="AS-new-form-input AS-new-form-input-full-width" type="password" name="_password" placeholder="{{ 'login.placeholder.password'|trans }}">
<div class="hidden">
<input type="checkbox" id="remember_me" name="_remember_me" checked />
<label for="remember_me">{{ 'login.label.remember_me'|trans }}</label>
</div>
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"/>
<button type="submit">{{ 'login.action.connect'|trans }}</button>
</form>
最后一个小精度,我的登录表单是用ajax处理的。因此,我使用以下内容提交登录表单
var username = ///I get the value from my input
var password = ///I get the value from my input
var csrfToken = ///I get the value from my input
$.ajax({
url: Routing.generate('login_check'),
type: 'POST',
data: {_username: username,_password: password ,_csrf_token: csrfToken, _remember_me: true},
success: function(data, statusText, xhr) {
///execute my function////
}
});
也请在下面找到我的导航器控制台的屏幕截图
基于第一个答案的其他信息
因此,根据我从Jovan获得的第一条评论,我更新了参数session.cookie_lifetime并将其设置为604800
session:
cookie_lifetime: 604800
现在的区别是PHPSESSID cookie具有正确的到期日期(如下面的屏幕快照所示)=>我在11月1日连接了用户,而到期日期是11月8日。
尽管断开连接花费了我更长的时间,但关闭标签后几个小时仍然断开连接(cookie的寿命大约为5个小时,而断开连接则需要1或2个小时)。
我还尝试了var_dump ini_get('session.gc_maxlifetime');
,我得到了1440。
您认为这与服务器端的会话生存期有关吗?
我应该更新session.gc_maxlifetime
参数吗?我应该在服务器端更新php.ini文件吗?
还有其他原因导致我与他人保持断开连接?
答案 0 :(得分:0)
cookie REMEMBERME
确实有效,但是对PHPSESSID
的查看显示它的有效期已满或倒退。无论如何,您的Cookie的发布日期都已过期。
因此,您可以在php.ini
或Symfony
配置中设置会话cookie超时。我更喜欢后者:
symfony.com > Session Cookie Lifetime
cookie_lifetime设置是cookie应该存活的秒数,它不是Unix时间戳。最终的会话Cookie将被标记为time()+ cookie_lifetime的到期时间,该时间是从服务器获取的时间。
如上所述,请注意,cookie_lifetime
是相对值。
希望这会有所帮助...
答案 1 :(得分:0)
所以我设法最终解决了我的问题。
我做了两个更改。
第一个:由于文件config.yml中的参数framework.session.save_path,我更改了用户会话的save_path。我将其更改为symfony存储库中的路径,而不是在共享服务器上使用“ / home / my-user-name / admin / tmp”。
第二个:我修改了共享服务器上的php.ini文件,并将session.gc_maxlifetime更新为604800。
我不知道这两项更改中的哪一项使它起作用了,但是现在可以正常工作了。