并发防火墙

时间:2015-11-02 14:27:33

标签: security symfony symfony-security

上下文: 我目前正在开发一个网站,其中某些功能仅适用于经过身份验证的成员。所以我有以下防火墙配置:

/app/config/security.yml:

security:
    encoders:
        members:
            class:              VE\ProjectBundle\Model\Member
            algorithm:          sha1
            iterations:         1
            encode_as_base64:   false
    providers:
        members:
            propel:
                class:      VE\ProjectBundle\Model\Member
                property:   email
    firewalls:
        member_area:
            pattern:    ^/
            provider:   members
            anonymous:  ~
            form_login:
                login_path:             /member
                check_path:             /member/validate-login
                username_parameter:     email
                password_parameter:     password
                default_target_path:    /member
            logout:
                path:   /member/logout
                target: /member
                invalidate_session: false

我还有一个可以访问URL“/ administration”的管理区域,其中包含以下配置:

/app/config/security.yml:

security:
    encoders:
        administrators:
            class:              VE\AdministrationBundle\Model\Administrator
            algorithm:          sha1
            iterations:         1
            encode_as_base64:   false
    providers:
        administrators:
            propel:
                class:      VE\AdministrationBundle\Model\Administrator
                property:   email
    firewalls:
        administration_area:
            pattern:    ^/administration
            provider:   administrators
            anonymous:  ~
            form_login:
                login_path:             /administration/administrator/login
                check_path:             /administration/administrator/validate-login
                username_parameter:     email
                password_parameter:     password
                default_target_path:    /administration
                csrf_parameter:         _token
            logout:
                path:   /administration/administrator/logout
                target: /administration
                invalidate_session: false
    access_control:
        administration_administrator_login:
            path: ^/administration/administrator/login
            roles: IS_AUTHENTICATED_ANONYMOUSLY
        administration:
            path: ^/administration
            roles: ROLE_ADMIN

问题: 我想在站点的全局模板(防火墙“member_area”后面)显示一个链接,当访问者通过防火墙“administration_area”进行身份验证时返回管理。事实上,我尝试做一些更复杂的事情,但我把问题简化得更清楚了。

/src/VE/ProjectBundle/Resources/views/globalTemplate.html.twig:

{% if app.user and is_granted('ROLE_ADMIN') %}
    <a href="#">Return to administration</a>
{% endif %}

除了防火墙的模式是“/ administration”,或者防火墙“administration_area”对于URL“/ home”没有活动,例如。此外,如果定义了“app.user”,它将包含一个对象“Member”而不是一个对象“Administrator”。

将防火墙“administration_area”的模式更改为“^ /”并未解决任何问题,因为之前执行了防火墙“member_area”。

更改配置中防火墙的顺序会引发相反的问题。如果定义了“app.user”,它将包含一个对象“Administrator”而不是一个对象“Member”。

在两个防火墙之间共享相同的上下文似乎不是解决方案,因为我们没有单个对象“User”。我希望绝对有两个独立的实体(会员和管理员)。

该解决方案似乎是Symfony的演变,允许在相同模式下配置并发防火墙。在此处查看我的帖子:https://github.com/symfony/symfony/issues/16378

你有什么想法来解决我的问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为定义两个防火墙,两个用户提供商等没有任何问题。

我不完全理解的是模板部分的问题。我会在模板中添加通常的is_granted(ROLE_ADMIN)is_granted(ROLE_MEMBER)检查以显示相应的链接。

在我看来,模板不应该关心用户登录的防火墙,以及登录用户的角色。并且不要担心安全性,因为“access_control”和选民将始终阻止访问不允许用户访问的任何资源。