Почему RememberMe не работает должным образом в Symfony2? - PullRequest
0 голосов
/ 31 октября 2018

Я использовал ключ «Remember_me» в моем файле « security.yml », чтобы использовать функцию запомнить_me Symfony. Я использовал всю неделю (пожалуйста, смотрите мой файл security.yml ниже) . Я использую Symfony версии 2.8.48 и friendsofsymfony / user-bundle версия v 2.0.1.

Так что после того, как я успешно войду на свой веб-сайт через форму входа в систему, файл cookie REMEMBERME будет отлично установлен , и я вижу его в моем навигаторе (Google Chrome), с правильной настройкой Expires / Max-Age на неделю позже (на скриншоте истекает 7 ноября, так как вход в систему был произведен 31 октября).

Но примерно через через один или два часа после закрытия вкладки страницы моего веб-сайта, если я вернусь на свой веб-сайт, хотя файл cookie REMEMBERME по-прежнему отображается в моем навигаторе, я уже отключен .

Как это возможно? Почему не работает функционал Remember_me? Я следил за точной настройкой документации Symfony по следующей ссылке:

https://symfony.com/doc/2.8/security/remember_me.html

В форме входа в систему я также добавил ввод с именем Remember_me в виде флажка (проверьте мой фрагмент ниже)

Это проблема, связанная с параметром сеанса в моем файле config.yml? Это связано с параметром cookie_lifetime?

Плюс, если я хочу выяснить, с чего мне начать. Где в «Symfony» запускается информация «проверьте, существует ли cookie-файл Remember_Me», и какой обработчик автоматически проверяет, существует ли «cookie-файл« Remember_me »?

Заранее спасибо.

Мой файл 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:  ~

Мой логин.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

Дополнительная информация, основанная на первых ответах

Итак, на основании первого комментария, который я получил от Йована, я обновил параметр session.cookie_lifetime и установил его на 604800

session:
    cookie_lifetime: 604800

Разница в том, что cookie PHPSESSID имеет правильную дату истечения срока действия (показано на скриншоте ниже) => Я подключил своего пользователя 1 ноября, а срок действия - 8 ноября.

enter image description here

Несмотря на то, что мне потребовалось больше времени, чтобы отключиться, я все же отключился через несколько часов после закрытия вкладки (при отключении cookie около 5 часов, без него это заняло 1 или 2 часа).

Я также пытался var_dump ini_get('session.gc_maxlifetime');, и я получаю 1440.

Как вы думаете, это связано с временем жизни сеанса на стороне сервера? Должен ли я обновить параметр session.gc_maxlifetime? Должен ли я обновить файл php.ini на стороне сервера ??

Какие-либо другие причины, почему я продолжаю отключаться?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Итак, в конце концов мне удалось решить мою проблему.

Я сделал два изменения.

Первый: я изменил save_path моего пользовательского сеанса, благодаря параметру framework.session.save_path в файле config.yml. Я изменил его на путь в моем хранилище Symfony вместо того, чтобы иметь «/ home / my-user-name / admin / tmp» на моем общем сервере.

Второй: я изменил файл php.ini на своем общем сервере и обновил session.gc_maxlifetime до 604800.

Я не знаю, какое из этих двух изменений заставило его работать, но сейчас оно работает нормально.

0 голосов
/ 01 ноября 2018

Печенье REMEMBERME кажется действительным, но если посмотреть на PHPSESSID, то обнаружится, что он прошел полный круг или вернулся назад с точки зрения срока годности. В любом случае ваш файл cookie выдается с уже истекшей датой.

Таким образом, вы можете установить тайм-аут сеансового cookie в вашем php.ini или в вашем Symfony конфиге. Я предпочитаю позже:

symfony.com> Время жизни файлов cookie сеанса

Параметр cookie_lifetime - это количество секунд, в течение которых cookie должен храниться, это не метка времени Unix. Полученный в результате сеансовый cookie будет помечен временем истечения времени () + cookie_lifetime, где время берется с сервера.

В соответствии с вышесказанным, обратите внимание, что cookie_lifetime равно относительное значение .

Надеюсь, это немного поможет ...

...