2016-01-15 3 views
0

У меня есть эти маршруты, определенные в app/config/routing.yml в Symfony 2.8 приложения:Как отлаживать (и исправлять) Symfony2 | 3 маршрута?

platform_chat: 
    resource: "@PlatformChatBundle/Controller/" 
    type:  annotation 
    prefix: /chat 

platform_admin: 
    resource: "@PlatformAdminBundle/Controller/" 
    type:  annotation 
    prefix: /admin 

#----> this is part of routing.yml but I forgot to add it 
easy_admin_bundle: 
    resource: "@PlatformAdminBundle/Controller/AdminController.php" 
    type:  annotation 
    prefix: /admin 

#FOSUser 
fos_user: 
    resource: "@FOSUserBundle/Resources/config/routing/all.xml" 

Как вы уже заметили, PlatformAdminBundle является бэкенд и PlatformChatBundle является интерфейс. Имея это в виду, я стараюсь setuo и использовать один брандмауэр для обоих, а затем на security.interactive_login событие перенаправить на правильный маршрут | путь. Это как брандмауэр выглядит следующим образом:

security: 
    ... 
    role_hierarchy: 
     ROLE_CHATTER:  ROLE_USER 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 
    ... 
    firewalls: 
     ... 
     ignored: 
      pattern: ^/(login(_check)?|logout|resetting)$ 
      security: false 
     global: 
      pattern: ^/admin/(.*)|^/chat/(.*) 
      provider: fos_userbundle 
      form_login: 
       csrf_provider: security.csrf.token_manager 
       login_path: fos_user_security_login 
       check_path: fos_user_security_check 
       # if true, forward the user to the login form instead of redirecting 
       use_forward: true 
       # login success redirecting options (read further below) 
       always_use_default_target_path: true 
       default_target_path: /admin 
       target_path_parameter: _target_path 
       use_referer: true 
       remember_me: true 
      logout: ~ 
      remember_me: 
       secret: '%secret%' 
       lifetime: 604800 # 1 week in seconds 
       path: /

    access_control: 
     - { path: ^/chat/, role: ROLE_CHATTER } 
     - { path: ^/admin/, role: ROLE_ADMIN } 

Но это не работает, потому что, когда я пытаюсь войти в систему или как пользователь я закончить с этой ошибкой:

You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.

Что заставляет меня думать, что маршруты или брандмауэр Арен 't правильно настроен. Я проверил маршруты под панелью отладки, и ни один из них не соответствует, поэтому они ошибочны. Я прочитал документы here, но это совсем не полезно, и я не получаю исправления проблемы. Вы можете взять этот пост как второй части из this one, но я не хочу менять тему старого и ни содержание, потому что я думаю, что это будет полезно для будущего для кого-то другого. Итак, какие-нибудь ребята? Что бы вы отлаживали такие проблемы, связанные с маршрутами? Любое исправление для моей конкретной проблемы? Я действительно застрял здесь!

Update

Я сделал изменения, как @xabbuh предложил так теперь app/config/routing.yml выглядит следующим образом:

platform_chat: 
    resource: "@PlatformChatBundle/Controller/" 
    type:  annotation 
    prefix: /chat 
    options: 
      expose: true 

platform_admin: 
    resource: "@PlatformAdminBundle/Controller/" 
    type:  annotation 
    prefix: /admin 
    options: 
     expose: true 

#EasyAdminBundle 
easy_admin_bundle: 
    resource: "@PlatformAdminBundle/Controller/AdminController.php" 
    type:  annotation 
    prefix: /admin 
    options: 
     expose: true 

#FOSUser 
fos_user: 
    resource: "@FOSUserBundle/Resources/config/routing/all.xml" 

#FOSUser Groups 
fos_user_group: 
    resource: "@FOSUserBundle/Resources/config/routing/group.xml" 
    prefix: /group 

#FOSJsRouting 
fos_js_routing: 
    resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml" 

и `` выглядит следующим образом:

security: 
    ... 
    firewalls: 
     ... 
     global: 
      pattern:/
      anonymous: true 
      provider: fos_userbundle 
      form_login: 
       csrf_provider: security.csrf.token_manager 
       login_path: fos_user_security_login 
       check_path: fos_user_security_check 
       use_forward: true # if true, forward the user to the login form instead of redirecting 
       always_use_default_target_path: true # login success redirecting options (read further below) 
       default_target_path: /admin 
       target_path_parameter: _target_path 
       use_referer: true 
       remember_me: true 
      logout: ~ 
      remember_me: 
       secret: '%secret%' 
       lifetime: 604800 # 1 week in seconds 
       path: /

    access_control: 
     - { path: ^/chat/, role: ROLE_CHATTER } 
     - { path: ^/admin/, role: ROLE_ADMIN } 

после ясно кэш вот мои попытки и результаты:

  • Войти как ROL_CHATTER: Я собираюсь http://domain.tld/app_dev.php/chat/, как и ожидалось. Я получаю форму для входа и используя действительные учетные данные. Я получаю следующее сообщение: Доступ запрещен. Вы CHATTER. Это правильно, потому что у меня есть слушатель на security.interactive_login, и это то, что я делаю, когда пользователь регистрируется с этими кредитами.
  • Войти как ROL_ADMIN: Я собираюсь http://domain.tld/app_dev.php/admin/, как и ожидалось. Я получаю форму для входа и используя действительные учетные данные. Я получаю следующее сообщение: Плохие учетные данные. Это неверно, потому что учетные данные действительны и, по крайней мере, я должен получить другое сообщение (Access Denied. Вы ADMIN), потому что слушатель на security.interactive_login, но, как я уже сказал, это не то, что происходит.

Информация, связанная с слушателем, находится на this post. Что не так?

+0

Каков путь, связанный с маршрутом 'fos_user_security_check'? – xabbuh

+0

@xabbuh нет совпадений с этим путем, см. [Этот рис.] (Http://content.screencast.com/users/ReynierPM/folders/Snagit/media/4a80a237-edba-4cda-94e7-5841dce3b57f/01.15.2016-15.08 .png) – ReynierPM

+0

Даже в вашем предыдущем посте у вас было это «BadCredentialsException», поэтому я думаю, что что-то не так с вашим администратором или вы его обрабатываете. Попробуйте отладить свою проблему, проверив трассировку стека и посмотрим, на что действительно выброшено исключение. – xabbuh

ответ

3

Ваша проблема заключается в том, что регулярное выражение, используемое для соответствия запросам для брандмауэра global, равно /admin/(.*)|^/chat/(.*), но ваш контрольный путь равен /login_check. Как вы видите, этот путь не будет соответствовать вашему брандмауэру, что приведет к сообщению об ошибке, которое вы опубликовали.

Если бы я был вами, я бы просто бросил брандмауэр для входа в систему и изменил регулярное выражение для брандмауэра global на /.Тогда вам нужно будет добавить anonymous: true, чтобы пользователи, которые не вошли в систему, могли получить доступ к форме входа в систему. Доступ к вашим защищенным областям будет по-прежнему запрещен вашей секцией управления доступом.

+0

Должен быть принят ответ. – malcolm

+0

@malcolm Я не могу заставить это работать, и я прошу xabbuh, если у вас есть свободное время, чтобы проверить мои источники? Я могу поделиться через битбакет, не так ли? – ReynierPM

+0

Да, пожалуйста, покажите свой код. – xabbuh