背景:我目前正在一个站点上工作,其中某些功能仅对经过身份验证的成员可用。所以我有以下防火墙配置:
/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
你有什么想法可以解决我的问题吗?
谢谢!