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

时间:2014-06-02 15:01:13

标签: php security symfony

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

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

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时,它工作正常,但它给了我拒绝/ account /前端的访问权限。 / admin /帐户在管理员面板中正常工作。我也试图让/ account /完全安全,而网站的其余部分可用但如果用户登录他们的信息应该通过" app.user"在Twig模板中输入密钥。我试图只创建/ account / firewalled,但后来我丢失了网站其余部分的安全上下文。这似乎是一个简单的场景,但遗憾的是它并不起作用。有没有人尝试过这样的事情来指出我做错了什么?

我还尝试了以下内容:

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 /登录这是奇怪的。

1 个答案:

答案 0 :(得分:1)

如果我误解了你的意图,请纠正我......

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

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网址。另一方面,每个访问者都可以使用/login和其他所有内容(已验证或未通过,无关紧要)。

希望这会有所帮助......

编辑:

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