多提供商、多防火墙和多主机的Symfony 2安全问题

多提供商、多防火墙和多主机的Symfony 2安全问题,symfony,symfony-security,Symfony,Symfony Security,我在设置Symfony 2的安全性时遇到一些问题。 我目前在我的security.yml中有这个 security: encoders: Acme\AdminBundle\Entity\AdminUsers: algorithm: bcrypt Acme\UserBundle\Entity\Users: algorithm: bcrypt role_hierarchy: ROLE_USER: ROLE_USER RO

我在设置Symfony 2的安全性时遇到一些问题。 我目前在我的security.yml中有这个

security:
encoders:
    Acme\AdminBundle\Entity\AdminUsers:
        algorithm: bcrypt
    Acme\UserBundle\Entity\Users:
        algorithm: bcrypt

role_hierarchy:
    ROLE_USER:        ROLE_USER
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]

providers:
    provider_admin:
        entity: { class: AdminBundle:AdminUsers, property: username }
    provider_user:
        entity: { class: UserBundle:Users, property: username }

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login:
        pattern: ^/login$
        security: false
        anonymous: ~

    recover:
        pattern: ^/(recover-password|generate-hash)$
        security: false
        anonymous: ~

    secured_area:
        pattern:   ^/
        provider: provider_admin
        host: admin.example.dev
        form_login:
          check_path: /login_check
          login_path: /login
          always_use_default_target_path: false
          default_target_path: /
          username_parameter: _username
          password_parameter: _password
        logout:
          path:   /logout
          target: /
        anonymous: ~

    public_secured_area:
        pattern:   ^/dashboard
        host: app.example.dev
        provider: provider_user
        form_login:
          check_path: /dashboard/login_check
          login_path: /login
          always_use_default_target_path: false
          default_target_path: /dashboard
          username_parameter: _username
          password_parameter: _password
        logout:
          path:   /public/logout
          target: /login
        anonymous: ~

access_control:
    - { path: ^/dashboard/*, roles: ROLE_USER }
    - { path: ^/*, roles: ROLE_ADMIN }
如您所见,我有两个不同的提供商、两个不同的防火墙和两个不同的主机。 这是因为我需要记录app.example.dev上users表中的用户和admin.example.dev上AdminUsers表中的用户

这是我在我的adminrouting.yml中的内容:

login:
  path: /login
  host: admin.example.dev
  defaults: { _controller: UserBundle:Security:login }
login_check:
  path: /login_check
  host: admin.example.dev
logout:
  path: /logout
  host: admin.example.dev
这就是我的应用程序routing.yml中的内容

public_login:
  path: /login
  host: app.example.dev
  defaults: { _controller: PublicBundle:Default:login }

public_login_check:
  path: /dashboard/login_check
  host: app.example.dev

public_logout:
  path: /dashboard/logout
  host: app.example.dev
现在它的设置方式在管理端一切正常。 在应用程序端,注销不起作用,它说:

Unable to find the controller for path "/dashboard/logout". Maybe you forgot to add the matching route in your routing configuration?
404 Not Found - NotFoundHttpException
它们似乎是以类似的方式设置的,但解决方案是我在应用程序中设置一个实际的控制器。注销路径,添加一个带有实际注销的注销操作,并重定向代码以使其正常工作。 这告诉我有些不对劲。知道那是什么吗

另外,登录一开始也不起作用,因为我发现security.yml文件的access_control部分中的2个条目被颠倒了,直到我再次阅读文档,并且我知道其中的路径需要从特定到一般列出

所以我的第二个问题是关于这一点:是否没有办法将访问控制项绑定到某个防火墙或至少绑定到主机

编辑: 虽然我得到了答案,见下文,但我仍想了解我的最后一个问题,即上面的两段,是否有效


谢谢。

更改
公共安全区域
防火墙如下:

public_secured_area:
    ...
    logout:
      path:   /dashboard/logout
      target: /login
    anonymous: ~
public_logout:
  path: /public/logout
  host: app.example.dev
或者像这样更改应用程序路由:

public_secured_area:
    ...
    logout:
      path:   /dashboard/logout
      target: /login
    anonymous: ~
public_logout:
  path: /public/logout
  host: app.example.dev

路由和注销路径应该是相同的。

是的,你是对的,更让我恼火的是,我知道注销路由需要在防火墙后面,但显然,尽管花了30分钟来公式化这个问题,我还是错过了security.yml中的错误注销路径。在过去的几天里,我改变了很多事情,以至于我忘记了那个公共url。非常感谢。