2

背景:我目前正在一个站点上工作,其中某些功能仅对经过身份验证的成员可用。所以我有以下防火墙配置:

/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”。

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

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

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

谢谢!

4

1 回答 1

0

我认为定义两个防火墙、两个用户提供程序等没有什么问题。

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

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

于 2016-01-28T11:58:06.223 回答