我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
前端。考虑到这一点,我正在尝试设置并为两者使用一个防火墙,然后将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/
将按预期获得登录表单并使用有效凭据我收到以下消息:访问被拒绝。你在喋喋不休。这是正确的,因为我有一个监听security.interactive_login
器,这就是用户使用这些凭据登录时我正在做的事情。 - 登录身份
ROL_ADMIN
:我http://domain.tld/app_dev.php/admin/
将按预期获得登录表单并使用有效凭据我收到以下消息:错误凭据。这是错误的,因为凭据是有效的,至少我应该收到另一条消息(访问被拒绝。您是管理员),因为监听器在security.interactive_login
但正如我所说的那样,这不是正在发生的事情。
与听众有关的信息在这篇文章中。怎么了?