并发防火墙
上下文: 我目前正在一个网站上,某些功能只可用于经过身份验证的成员。所以,我有以下防火墙配置:并发防火墙
/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“/管理”和访问行政管理区域以下配置:
/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
问题: 我想在网站的全局模板显示(防火墙后面的“米ember_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_area” 不活跃例如,为“/ home”的网址。另外,如果定义了“app.user”,它将包含对象“成员”而不是对象“管理员”。
将防火墙“administration_area”的模式更改为“^ /”并不能解决任何问题,因为之前执行了防火墙“member_area”。
更改配置中防火墙的顺序提出了相反的问题。如果定义了“app.user”,它将包含一个对象“管理员”而不是一个对象“成员”。
在两个防火墙之间共享相同的上下文似乎不是解决方案,因为我们没有单个对象“用户”。我希望绝对有两个独立的实体(会员和管理员)。
该解决方案似乎是Symfony的一种演进,以允许在相同模式下配置并发防火墙。看到我的帖子:https://github.com/symfony/symfony/issues/16378
你有什么想法来解决我的问题吗?
谢谢!
我不认为有什么不妥定义两个防火墙,两个用户提供商等
我不完全了解与模板的一部分的问题。我会在模板中添加通常的is_granted(ROLE_ADMIN)
和is_granted(ROLE_MEMBER)
检查以显示相应的链接。
在我看来,模板不应该关心用户登录哪个防火墙,而是记录用户拥有哪些角色。不要担心安全问题,因为“access_control”和选民总是会阻止访问用户不被允许访问的任何资源。
调用'is_granted('ROLE_NAME')'相当于在AuthorizationChecker服务上调用“isGranted”方法。 “isGranted”方法基于当前安全令牌,该令牌不能同时是成员实例和管理员实例。匹配的第一个防火墙决定了安全令牌。如果它是“member_area”防火墙:我的安全令牌将永远是一个成员实例。并测试角色“ROLE_ADMIN”它总是返回false。 –
为什么你需要两个独立的实体?我会使用相同的防火墙并检查“ROLE_ADMIN”。 – windm
我的两个实体位于不同的包中,并具有与身份验证(电子邮件,密码和盐)相关的属性。我想保持这种分离。 –