Symfony 2防火墙-前端和管理面板具有相同的用户


Symfony 2 firewalls - front end and admin panel with the same user

我正在为客户端做一个简单的CMS,我遇到了Symfony 2实现安全的防火墙问题。我设置了2个bundle - CMSBundle和AdminPanelBundle -第一个用于前端,第二个用于管理面板。我通过客户提供程序(实现UserProviderInterface)通过数据库连接到表用户,并在列中使用角色ROLE_USER和ROLE_ADMIN,为用户实现了安全性。

bundle中的每个登录都可以通过/login和/admin/login单独工作,但我想做的是让它们一起工作,所以如果用户有ROLE_ADMIN,他们可以看到前端和管理面板,如果ROLE_USER只有前端。因此,如果用户以正确的角色登录任何一个bundle,就会看到正确的内容。我的安全配置如下:

security:
firewalls:
    user_login:
        pattern:    /login$
        security: false
    user_area:
        pattern:    /
        anonymous:  ~
        form_login:
            login_path: /login
            check_path: /login_check
        logout:
            path:   /logout
            target: /
        remember_me:
            key:      "user_secret"
            lifetime: 31536000
            path:     /account/
            domain:   ~
    admin_login:
        pattern:    /admin/login$
        security: false
    admin_area:
        pattern:    /admin/
        form_login:
            login_path: /admin/login
            check_path: /admin/login_check
        logout:
            path:   /admin/logout
            target: /admin/
        remember_me:
            key:      "admin_secret"
            lifetime: 31536000
            path:     /admin/
            domain:   ~
access_control:
    - { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /account/([a-z_]+)?, roles: ROLE_USER }
    - { path: /admin/([a-z_]+)?, roles: ROLE_ADMIN }

当我登录/login,它工作得很好,但它给了我访问拒绝/帐户/前端。/admin/帐户在管理面板中工作正常。我也试图有/帐户/完全安全,而网站的其余部分是可用的,但如果用户登录他们的信息应该通过"app.user"键在Twig模板中看到。我试图只设置/account/防火墙,但这样我就失去了网站其余部分的安全上下文。这似乎是一个简单的场景,但不幸的是,它不起作用。有没有人试过实施这样的东西来指出我做错了什么?

我还尝试了以下操作:

security:
firewalls:
    user_area:
        pattern:    /
        anonymous:  ~
        form_login:
            login_path: /login
            check_path: /login_check
        logout:
            path:   /logout
            target: /
        remember_me:
            key:      "user_secret"
            lifetime: 31536000
            path:     /account/
            domain:   ~
    admin_area:
        pattern:    /admin/
        form_login:
            login_path: /admin/login
            check_path: /admin/login_check
        logout:
            path:   /admin/logout
            target: /admin/
        remember_me:
            key:      "admin_secret"
            lifetime: 31536000
            path:     /admin/
            domain:   ~
access_control:
    - { path: /account/([a-z_]+)?, roles: ROLE_USER }
    - { path: /admin/([a-z_]+)?, roles: ROLE_ADMIN }
    - { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /, roles: IS_AUTHENTICATED_ANONYMOUSLY }

仍然不工作。我需要两个不同的登录点,因为管理员将登录/admin/login(与一个设计)和用户通过前端/登录与前端设计。现在有了这个设置/帐户给我访问拒绝,当我试图访问/admin没有登录它带我到/login,而不是/admin/login这是奇怪的。

如果我误解了你的意图,请纠正我,但是……

我认为您可以将防火墙pattern设置为仅/,并在security.yml按钮处使用access_control设置细粒度权限:

access_control:
- { path: /account/([a-z_]+)?, roles: ROLE_USER }
- { path: /admin/([a-z_]+)?, roles: ROLE_ADMIN }
- { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /, roles: IS_AUTHENTICATED_ANONYMOUSLY }

来自官方文档:

对于每个传入请求,Symfony2检查每个access_control条目以找到与当前请求匹配的条目。一旦找到匹配的access_control项,就停止——只有第一个匹配的access_control项被用来强制访问。

因此,这将保护您的/account/admin url。另一方面,/login和其他所有内容将对每个访问者可用(无论是否经过身份验证,都无关紧要)。

编辑:

我忘了提到:您只需要一个防火墙(/模式),否则此解决方案将不起作用。