2015-11-02 204 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。 –