0

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但正如我所说的那样,这不是正在发生的事情。

与听众有关的信息在这篇文章中。怎么了?

4

1 回答 1

3

您的问题是用于匹配global防火墙请求的正则表达式是/admin/(.*)|^/chat/(.*),但您的检查路径是/login_check. 如您所见,您的防火墙不会匹配该路径,这会导致您发布的错误消息。

如果我是你,我会简单地将防火墙放在登录相关内容之前,并将global防火墙的正则表达式更改为/. 然后,您只需添加anonymous: true,以便未登录的用户能够访问登录表单。您的访问控制部分仍会拒绝访问您的保护区。

于 2016-01-15T20:17:35.553 回答