上下文: 我目前正在开发一个网站,其中某些功能仅适用于经过身份验证的成员。所以我有以下防火墙配置:
/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
你有什么想法来解决我的问题吗?
谢谢!
答案 0 :(得分:0)
我认为定义两个防火墙,两个用户提供商等没有任何问题。
我不完全理解的是模板部分的问题。我会在模板中添加通常的is_granted(ROLE_ADMIN)
和is_granted(ROLE_MEMBER)
检查以显示相应的链接。
在我看来,模板不应该关心用户登录的防火墙,以及登录用户的角色。并且不要担心安全性,因为“access_control”和选民将始终阻止访问不允许用户访问的任何资源。