Невозможно войти с помощью Symfony Guard, возможно, из-за файлов cookie и мультидомена - PullRequest
0 голосов
/ 28 сентября 2018

Мне нужна очень простая форма входа в систему, поэтому я использую для этого аутентификатор Symfony Guard.

Мое приложение является многодоменным, на данный момент вход возможен только для 3 из них (а 2субдомены).Но я не могу войти ни на одном из них.

Во-первых, вот несколько ресурсов:

Я не понимаю почему, но для отладки я попытался обновить config/packages/dev/web_profiler.yaml для установки intercept_redirects: true, чтобы отладить куки и конфигурацию безопасности, и вот что я имею при воспроизведении сценария обычного входа в систему:

  • При доступе к странице бэкэнда (которая показывает форму входа в систему) у меня есть файл cookie сеанса со значением, таким как llno5smlmsema5nq02kr30s6m2.
  • После того, как я отправляю форму с правильными значениями, я вижу страницу перенаправления профилировщика,и панель инструментов веб-отладки показывает мне, что я Logged in as Pierstoval, а cookie-файл сеанса, отправленный ответом, меняет идентификатор и становится b1vbcnvp7e6p0j0o0vtd7ui7bf (потому что по умолчанию брандмауэр переносит сеанс при входе в систему), так что это работает.Я даже вижу, что токен находится в сессии.Я также добавил операторы dump() в метод Session::save(), и при выводе содержимого сеанса отображается токен.И токен находится в файле сеанса, когда я тоже его выгружаю (в var/sessions/dev/sess_b1vbcnvp7e6p0j0o0vtd7ui7bf).
  • Я нажимаю на ссылку http://back.esteren.docker/fr/, отображаемую на странице перенаправления, и затем я вижу, что идентификатор файла cookie сеанса неизменить (это тот, который был установлен после входа в систему), но на этот раз, панель инструментов веб-отладки показывает мне, что я Logged in as anon..

Для меня есть проблема, когда сеанссохраняется, поэтому я посмотрел на файлы сеанса в var/sessions/dev/, после перенаправления .

Когда я cat var/sessions/dev/sess_b1vbcnvp7e6p0j0o0vtd7ui7bf, я вижу это:

_sf2_attributes|a:2:{s:18:"_csrf/authenticate";s:43:"bCm23vBGyrq52caehAH9cCTjJkAmdT9j9Z8yygaET78";s:26:"_security.main.target_path";s:30:"http://back.esteren.docker/fr/";}_sf2_meta|a:3:{s:1:"u";i:1538092899;s:1:"c";i:1538092750;s:1:"l";s:5:"86400";}

Что при десериализации массива мешков атрибутов сеанса дает следующее:

array:2 [
  "_csrf/authenticate" => "bCm23vBGyrq52caehAH9cCTjJkAmdT9j9Z8yygaET78"
  "_security.main.target_path" => "http://back.esteren.docker/fr/"
]

Это означает, что токен не был сохранен в сеансе после успешного входа в систему.

И еще хуже:так как я уже отлаживал файл сеанса до перенаправления , я знаю , что он был сохранен в сеансе и в какое-то время он был удален из него до начала сеансаСохранено в другой раз.

Как это вообще возможно?Я что-то забыл в своей конфигурации безопасности?

Как примечание, я протестировал с и без докера (с простой установкой php-fpm + nginx), и ни один не работал, это вероятноозначает, что это не проблема разрешения со стороны докера ...

1 Ответ

0 голосов
/ 28 сентября 2018

Наконец, благодаря @Lynn и @Wirone на общедоступных каналах Symfony Slack, я получил решение.

Во-первых, ошибка заключалась в том, что моя сущность User (которая сериализуется в сеансе)) не сохранял пароль.
И при создании токена он проверяет, совпадает ли «старый» (в сеансе) пароль пользователя с «новым» (обновленным), благодаря the Abstractoken::hasUserChanged() method .

И если объект пользователя изменился, брандмауэр выводит пользователя из системы .

Чтобы исправить это, либо сериализовайте пароль с помощьюпользователь, или внедрите EquatableInterface и используйте свои собственные проверки.

И это то, что я сделал здесь :

  • Реализация EquatableInterface
  • Только для сериализации id и поля с отметкой времени ̀createdAt and updatedAt`
  • Сделайте isEqualTo() проверки полей класса и даты, чтобы узнать, изменился ли пользователь.это помогает ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...