Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么Memberme在Symfony2中不能正常工作?_Php_Symfony_Login_Symfony 2.8_Remember Me - Fatal编程技术网

Php 为什么Memberme在Symfony2中不能正常工作?

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日到期) 但是在关闭

我在我的文件“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文件

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_dump
ini_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