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

Posted

技术标签:

【中文标题】Symfony 2 与多个提供商、多个防火墙和多个主机的安全问题【英文标题】:Symfony 2 security issues with multiple providers, multiple firewalls and multiple hosts 【发布时间】:2015-01-19 16:21:34 【问题描述】:

我在设置 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 

如您所见,我有 2 个不同的提供商、2 个不同的防火墙和 2 个不同的主机。 那是因为我需要记录 app.example.dev 上的用户表中的用户和 admin.example.dev 上的 AdminUsers 表中的用户。

这就是我的 admin routing.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

这就是我的 app 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

它们似乎以类似的方式设置,但解决方案是让我在 app. 注销路由中设置一个实际的控制器,添加一个带有实际注销和重定向代码的注销操作为此工作。 这告诉我出了点问题。知道那是什么吗?

同样登录起初也不起作用,因为我在 security.yml 文件的 access_control 部分中的 2 个条目被颠倒了,直到我再次阅读文档并且我明白那里的路径需要从特定列表中列出一般。

所以我的第二个问题是关于这个:有没有办法将 access_control 条目绑定到某个防火墙或至少绑定到主机?

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

谢谢。

【问题讨论】:

【参考方案1】:

像这样更改public_secured_area防火墙:

public_secured_area:
    ...
    logout:
      path:   /dashboard/logout
      target: /login
    anonymous: ~

或像这样更改应用程序路由:

public_logout:
  path: /public/logout
  host: app.example.dev

路由和登出路径应该相同..

【讨论】:

是的,你是对的,更让我烦恼的是,我知道注销路由需要在防火墙后面,但显然尽管花了 30 分钟制定这个问题,但我错过了错误的注销路径在 security.yml 中。在过去的几天里,我改变了很多东西,以至于我忘记了那个 /public url。谢谢。

以上是关于Symfony 2 与多个提供商、多个防火墙和多个主机的安全问题的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 中的多个动态防火墙和 CAS 服务器

symfony:在多个防火墙中模拟用户

Symfony 4 - 安全性 - 从多个防火墙相互共享上下文

Symfony多个Ldap提供程序

如何在 symfony 中使用多个用户提供者 5. 如何链接它?

Symfony2 安全性:多个提供者