Как отладить ошибку аутентификации symfony4

Я пытаюсь настроить традиционную форму входа и регистрации, следуя документации Symfony 4.

Используя регистрационную форму, я, кажется, могу правильно регистрировать пользователей в базе данных mariaDB на Arch Linux.


Я использую сервер разработки Symfony. Когда я пытаюсь войти в систему с зарегистрированным пользователем, я получаю этот HTML-код на странице входа.

Запрос аутентификации не может быть обработан из-за системной проблемы.

Если пользователь или пароль неверны или я не заполняю поля, я получаю ту же ошибку.

Запуск разработки Symfony 4 с -vvv verboses отображает

2018-01-26T16:10:26+00:00 [info] Matched route "login".
2018-01-26T16:10:26+00:00 [info] Authentication request failed.
2018-01-26T16:10:26+00:00 [debug] Authentication failure, redirect triggered.
[Fri Jan 26 17:10:26 2018] 127.0.0.1:52250 [302]: /login
2018-01-26T16:10:26+00:00 [info] Matched route "login".
2018-01-26T16:10:26+00:00 [info] Populated the TokenStorage with an anonymous Token.
[Fri Jan 26 17:10:26 2018] 127.0.0.1:52252 [200]: /login

При использовании сетевого инспектора Firefox кажется, что сообщение о входе в систему возвращает ошибку 302. Я не знаю, как это отладить или как получить дополнительную информацию.


Это security.yaml

# config/packages/security.yaml                                                                           
security:                                                                                                 
  encoders:                                                                                               
    App\Entity\User:                                                                                      
      algorithm: bcrypt                                                                                   
  providers:                                                                                              
    our_db_provider:                                                                                      
      entity:                                                                                             
        class: App\Entity\User                                                                            
        property: username                                                                                
  firewalls:                                                                                              
    main:                                                                                                 
      provider: our_db_provider                                                                           
      pattern: ^/                                                                                         
      anonymous: ~                                                                                        
      form_login:                                                                                         
        login_path: login                                                                                 
        check_path: login                                                                                 
  access_control:                                                                                         
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }                                              
    - { path: ^/register$, role: IS_AUTHENTICATED_ANONYMOUSLY }                                           
    - { path: ^/, role: ROLE_USER }                                                                       
                                     

Я не использую имя пользователя, поэтому я удалил его из класса User и контроллера регистрации и заставил user.getUsername возвращать адрес электронной почты пользователя, как это было предложено в документе.


person NanoPish    schedule 26.01.2018    source источник
comment
Поскольку 302 - это перенаправленный запрос, вы можете использовать профилировщик для просмотра последнего запроса и связанных журналов.   -  person goto    schedule 26.01.2018
comment
@NanoPish попробуйте изменить check_path на что-нибудь еще, например login_check, и измените URL-адрес сообщения в форме входа в систему login_check.   -  person Archi    schedule 26.01.2018
comment
В настоящее время я пытаюсь реализовать то же самое, но на данный момент я позволяю базовой аутентификации вводить имя пользователя / пароль. Я не вижу никаких ошибок в моем случае, но базовая аутентификация повторяется снова и снова, без регистрации. См. Мою проблему: stackoverflow.com/questions/48483993/   -  person Pete_Gore    schedule 28.01.2018
comment
@Pete_Gore Я постараюсь помочь, когда появится возможность.   -  person NanoPish    schedule 28.01.2018
comment
@Archi, если я заменяю check_path на login_check, я получаю Unrecognized option login_check в security.firewalls.main.form_login при запуске сервера. Где еще встречается check_path, который мне нужно отредактировать?   -  person NanoPish    schedule 01.02.2018
comment
@NanoPish вам нужно создать пустое действие контроллера для пути login_check.   -  person Archi    schedule 01.02.2018


Ответы (2)


Ваша проблема в следующем:

property: username

В безопасности yaml просто замените его на электронную почту, поскольку вы не используете переменную имени пользователя из пользовательского интерфейса.

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

person Epoch    schedule 01.02.2018

Я столкнулся с той же проблемой и хотел бы добавить некоторые детали к принятому ответу Epoch. Вот шаги для отладки с помощью панели инструментов веб-отладки Symfony

Примечание. Я использую FOSUserBundle, но эти шаги общие для отладки

  1. Откройте панель инструментов отладки и нажмите маркер рядом с 302 Request, чтобы открыть профилировщик, как показано на рисунке введите описание изображения здесь

  2. Это откроет профилировщик с отладочной информацией о текущем запросе, который в данном случае был 302. Но нам нужно отладить где authentication failure произошло. Поэтому щелкните Last 10 в меню слева, как показано здесь на рисунке  введите описание изображения здесь

  3. Теперь откроется страница с Last 10 запросами. Найдите запрос, который действительно выполняет аутентификацию. В моем случае это POST запрос /login_check. Щелкните токен, чтобы открыть сведения об отладке для этого запроса  введите описание изображения здесь

  4. Теперь найдите канал security или то, что вы настроили для журналов / ошибок аутентификации. введите описание изображения здесь

Теперь вы можете посмотреть подробности сбоя аутентификации. Надеюсь, это поможет другим, имеющим такую ​​же проблему. Спасибо!

person Azhar Khattak    schedule 10.09.2018