繁体   English   中英

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

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

我正在为客户端执行一个简单的CMS,并且遇到了Symfony 2安全实现的防火墙问题。 我设置了2个包-CMSBundle和AdminPanelBundle-第一个用于前端,第二个用于管理面板。 我已经通过客户提供程序(实现UserProviderInterface)通过数据库连接到具有列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在管理面板中可以正常工作。 我还尝试使/ account /完全安全,同时使网站的其余部分可用,但是如果用户登录,则应该通过Twig模板中的“ app.user”键看到他们的信息。 我试图只对/ 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(具有一种设计)登录,而用户则通过具有前端设计的前端/ login登录。 现在,通过此设置,/ account使我可以拒绝访问,当我尝试不登录而访问/ 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和其他所有内容都将可供每个访问者使用(无论是否经过身份验证,都没有关系)。

希望这可以帮助...

编辑:

我忘了提:您将只需要一个防火墙(带有/模式),否则该解决方案将无法工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM