2015-11-02 199 views
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“/管理”和访问行政管理区域以下配置:

/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

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

谢谢!

+0

为什么你需要两个独立的实体?我会使用相同的防火墙并检查“ROLE_ADMIN”。 – windm

+0

我的两个实体位于不同的包中,并具有与身份验证(电子邮件,密码和盐)相关的属性。我想保持这种分离。 –

回答

0

我不认为有什么不妥定义两个防火墙,两个用户提供商等

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

在我看来,模板不应该关心用户登录哪个防火墙,而是记录用户拥有哪些角色。不要担心安全问题,因为“access_control”和选民总是会阻止访问用户不被允许访问的任何资源。

+0

调用'is_granted('ROLE_NAME')'相当于在AuthorizationChecker服务上调用“isGranted”方法。 “isGranted”方法基于当前安全令牌,该令牌不能同时是成员实例和管理员实例。匹配的第一个防火墙决定了安全令牌。如果它是“member_area”防火墙:我的安全令牌将永远是一个成员实例。并测试角色“ROLE_ADMIN”它总是返回false。 –