У меня эти маршруты определены в app/config/routing.yml
в приложении Symfony 2.8:
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 }
Но это не работает, потому что, когда я пытаюсь войти в систему как пользователь, я заканчиваю эту ошибку:
Вы должны настроить путь проверки, который будет обрабатываться брандмауэром, используя form_login в конфигурации брандмауэра безопасности.
Это заставляет меня думать, что маршруты или брандмауэр настроены неправильно. Я проверил маршруты под панелью отладки, и ни один из них не соответствует, поэтому они ошибочны. Я читал документы здесь, но это не полезно вообще, и я не получаю исправления проблемы. Вы можете взять это сообщение как вторую часть этого, но я не хочу менять тему старого и ни содержание, потому что я думаю, что это будет полезно для будущего для кого-то другого. Итак, какие-нибудь ребята? Что бы вы отлаживали такие проблемы, связанные с маршрутами? Любое исправление для моей конкретной проблемы? Я действительно застрял здесь!
Обновить
Я внес изменения, поскольку @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/
как и ожидалось. Я получаю форму входа и используя действительные учетные данные. Я получаю следующее сообщение: Access Denied. Вы ХАРАКТЕР . Это правильно, потому что у меня есть слушатель в security.interactive_login
и это то, что я делаю, когда пользователь регистрируется с этими кредитами. ROL_ADMIN
: я ROL_ADMIN
на http://domain.tld/app_dev.php/admin/
как и ожидалось. Я получаю форму входа и используя действительные учетные данные. Я получаю следующее сообщение: Плохие учетные данные . Это неправильно, потому что учетные данные действительны и, по крайней мере, я должен получить другое сообщение ( Access Denied. ADMIN ), потому что слушатель в security.interactive_login
но, как я уже сказал, это не то, что происходит. Информация, связанная с слушателем, находится в этом сообщении . Что не так?
Ваша проблема заключается в том, что регулярное выражение, используемое для соответствия запросам global
брандмауэра, это /admin/(.*)|^/chat/(.*)
, но ваш контрольный путь – /login_check
. Как вы видите, этот путь не будет соответствовать вашему брандмауэру, что приведет к сообщению об ошибке, которое вы опубликовали.
Если бы я был вами, я бы просто сбросил брандмауэр, чтобы связать вещи, связанные с регистрацией, и изменить регулярное выражение для global
брандмауэра на /
. Тогда вам нужно будет добавить anonymous: true
чтобы пользователи, которые не вошли в систему, могли получить доступ к форме входа. Доступ к вашим защищенным областям будет по-прежнему запрещен вашей секцией управления доступом.