为什么RememberMe在Symfony2中无法正常工作?

时间:2018-10-31 14:41:24

标签: php symfony login symfony-2.8 remember-me

我在文件“ 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////
        }
    });

也请在下面找到我的导航器控制台的屏幕截图

enter image description here

基于第一个答案的其他信息

因此,根据我从Jovan获得的第一条评论,我更新了参数session.cookie_lifetime并将其设置为604800

session:
    cookie_lifetime: 604800

现在的区别是PHPSESSID cookie具有正确的到期日期(如下面的屏幕快照所示)=>我在11月1日连接了用户,而到期日期是11月8日。

enter image description here

尽管断开连接花费了我更长的时间,但关闭标签后几个小时仍然断开连接(cookie的寿命大约为5个小时,而断开连接则需要1或2个小时)。

我还尝试了var_dump ini_get('session.gc_maxlifetime');,我得到了1440。

您认为这与服务器端的会话生存期有关吗? 我应该更新session.gc_maxlifetime参数吗?我应该在服务器端更新php.ini文件吗?

还有其他原因导致我与他人保持断开连接?

2 个答案:

答案 0 :(得分:0)

cookie REMEMBERME确实有效,但是对PHPSESSID的查看显示它的有效期已满或倒退。无论如何,您的Cookie的发布日期都已过期。

因此,您可以在php.iniSymfony配置中设置会话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。

我不知道这两项更改中的哪一项使它起作用了,但是现在可以正常工作了。