Php 为什么Memberme在Symfony2中不能正常工作?
我在我的文件“security.yml”中使用了键“记住我”,以便使用Symfony的记住我的功能。我使用了一周的时间(请参阅下面我的security.yml文件)。我使用的是Symfony 2.8.48版和friendsofsymfony/user bundle 2.0.1版 因此,当我通过我的登录表单成功登录到我的网站后,记忆cookie被完美设置,我可以在我的导航器(谷歌浏览器)上看到,并正确设置了一周后的过期/Max Age(在屏幕截图上,从10月31日登录到11月7日到期) 但是在关闭我的网站页面的标签后一到两个小时左右,如果我回到我的网站,尽管记忆cookie仍然出现在我的导航器上,但我已经断开了连接 这是怎么可能的?为什么记忆功能不起作用?我按照Symfony文档中的确切设置,通过以下链接: 在我的登录表单中,我还以复选框的形式添加了名为memore_me的输入(检查下面的代码片段) 这是否与我的文件config.yml中的session参数有关?是否与cookie\u life参数有关 另外,如果我想调查,我应该从哪里开始。Symfony中触发的信息“检查是否存在memory\u me cookie”在哪里?什么处理程序会自动检查是否存在memory\u me cookie 先谢谢你 我的security.yml文件Php 为什么Memberme在Symfony2中不能正常工作?,php,symfony,login,symfony-2.8,remember-me,Php,Symfony,Login,Symfony 2.8,Remember Me,我在我的文件“security.yml”中使用了键“记住我”,以便使用Symfony的记住我的功能。我使用了一周的时间(请参阅下面我的security.yml文件)。我使用的是Symfony 2.8.48版和friendsofsymfony/user bundle 2.0.1版 因此,当我通过我的登录表单成功登录到我的网站后,记忆cookie被完美设置,我可以在我的导航器(谷歌浏览器)上看到,并正确设置了一周后的过期/Max Age(在屏幕截图上,从10月31日登录到11月7日到期) 但是在关闭
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
My config.yml文件(仅会话部分):
My login.html.twig(本问题的简化版):
请在下面找到我的导航器控制台的屏幕截图
基于第一个答案的额外信息
因此,根据我从Jovan那里得到的第一条评论,我更新了参数session.cookie_life,并将其设置为604800
session:
cookie_lifetime: 604800
现在的区别是PHPSESSID cookie的有效期是正确的(通过下面的屏幕截图显示)=>我在11月1日连接了我的用户,有效期是11月8日
虽然断开连接花费了我更长的时间,但在关闭我的标签几小时后,我仍然会断开连接(cookie的生存期大约为5小时,如果没有它,则需要1到2个小时)
我还尝试使用var_dumpini_get('session.gc\u maxlifest');
得到1440
您认为这与服务器端的会话生存期有关吗?
我应该更新session.gc\u maxlifest
参数吗?我应该更新服务器端的php.ini文件吗
是否有其他原因导致我不断断开连接?cookie
REMEMBERME
看起来确实有效,但查看PHPSESSID
会发现它在到期日期上走了一个完整的循环或倒退。在任何情况下,您的cookie都已过期
因此,您可以在php.ini
或Symfony
配置中设置会话cookie超时。我更喜欢后者:
cookie_生存期设置是cookie应该生存的秒数,它不是Unix时间戳。生成的会话cookie将被标记为过期时间()+cookie_生存期,其中时间是从服务器获取的
根据以上内容,请注意,cookie\u寿命
是相对值
希望这有点帮助…所以我最终设法解决了我的问题 我做了两个改变 第一个:由于config.yml文件中的参数framework.session.save_path,我更改了用户会话的save_路径。我将其更改为symfony存储库中的路径,而不是共享服务器上的“/home/my user name/admin/tmp” 第二个:我修改了共享服务器上的php.ini文件,并将session.gc_maxlifetime更新为604800
我不知道这两个更改中的哪一个使它工作了,但它现在工作得很好。Hi@Jovan,首先感谢您的帮助。不幸的是,我尝试在屏幕截图中更新security.yml文件(session.cookie_life=604800)中的cookie_life,phpsid过期日期现在是正确的(一周后).但是我在关闭我的标签几个小时后仍然断开了连接(虽然这次花了更多的时间)。我将ini退出(“session.gc\u maxlifetime”)我得到1440。也许我的问题与此有关?你对我断开连接的原因有其他想法吗?我刚刚尝试设置gc_maxlifetime:604800,我会测试它并让你知道。所以我刚刚尝试了一些新的东西。我发现:我还注意到cookie_lifetime在我的MAMP本地服务器上工作得很好,但在我的生产服务器上没有。所以我联系我的托管公司以获取任何删除会话的cron任务。我还将生产服务器的php.ini文件上的session.gc_maxlife从1440更新为604800。(知道在我的本地MAMP上,session.gc_maxlife设置为1440,但它工作得很好)我会让你知道它是否解决了我的问题。我还注意到session.save_路径的生产php.ini的默认配置是/home/my user name/admin/tmp,因此它可能还与tmp文件在我的服务器上被擦除的事实有关。我不确定,但这可能是一个假设。因此,我还将尝试其他一些方法,这可能是错误的正在将我的symfony应用程序上的session.save_路径设置为与tmp不同的文件夹。我会让您知道它是如何运行的。是的,访问权限也可能会生效。本机会话引擎将会话存储为文件形式,无法保存它可能会导致上述问题。您能否尝试更改路径?是的,这就是我所做的。我将我等了几个小时才回来
<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>
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////
}
});
session:
cookie_lifetime: 604800