2012-06-13 57 views
6

我有一個很大的問題,我role_hierarchy,role_hierarchy與Symfony2的

security: 
    role_hierarchy: 
     ROLE_ADMIN:[ROLE_USER,ROLE_AUTHOR,ROLE_MODERATOR] 
     ROLE_SUPER_ADMIN:[ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH] 

用,如果我得到了超級管理員的角色,我就得到了ROLE_AUTHOR,ROLE_MODERATOR,ROLE_USER和ROLE_ADMIN。但我的問題是,當我在我的網站上登錄時,如果我檢查分析器,我可以看到我只有ROLE_SUPER_ADMIN,而不是其他角色,所以,你能幫我嗎?

我的觀點(base.html.twig

<h3>Blog</h3> 
<ul class="nav nav-pills nav-stacked"> 
    <li><a href="{{ path('dom_home') }}">Home Page</a></li> 
    {% if is_granted('ROLE_AUTHOR') %} 
     <li><a href="{{ path('dom_add') }}">Add a post</a></li> 
    {% endif %} 
    {% if is_granted('IS_AUTHENTICATED_FULLY') %} 
     <li><a href="{{ path('fos_user_security_logout') }}">Logout</a></li> 
    {% else %} 
     <li><a href="{{ path('fos_user_security_login') }}">login</a></li> 
     <li><a href="{{ path('fos_user_registration_register') }}">register</a></li> 
    {% endif %} 
</ul> 

security.yml(應用程序/配置)

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  [ROLE_USER,ROLE_AUTHOR,ROLE_MODERATOR] 
     ROLE_SUPER_ADMIN: [ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     in_memory: 
      users: 
       user: { password: userpass, roles: [ 'ROLE_USER' ] } 
       admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 
     fos_userbundle: 
      id: fos_user.user_manager 
    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 
     login: 
      pattern: ^/(login$|register|resetting) 
      anonymous: true 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       remember_me: true 
       always_use_default_target_path: true 
       default_target_path: /dom/ 
      remember_me: 
       key:   %secret% 
      anonymous:  false 
      logout:   true 

編輯:

我的觀點(base.html.twig)

<h3>Blog</h3> 
<ul class="nav nav-pills nav-stacked"> 
    <li><a href="{{ path('dom_home') }}">Home Page</a></li> 
    {% if is_granted('ROLE_AUTHOR') %} 
     <li><a href="{{ path('dom_add') }}">Add a post</a></li> 
    {% endif %} 
    {% if is_granted('IS_AUTHENTICATED_FULLY') %} 
     <li><a href="{{ path('fos_user_security_logout') }}">Logout</a></li> 
    {% else %} 
     <li><a href="{{ path('fos_user_security_login') }}">login</a></li> 
     <li><a href="{{ path('fos_user_registration_register') }}">register</a></li> 
    {% endif %} 
</ul> 

我security.yml(應用程序/配置)

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  [ROLE_USER,ROLE_AUTHOR,ROLE_MODERATOR] 
     ROLE_SUPER_ADMIN: [ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     in_memory: 
      users: 
       user: { password: userpass, roles: [ 'ROLE_USER' ] } 
       admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 
     fos_userbundle: 
      id: fos_user.user_manager 
    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 
     login: 
      pattern: ^/(login$|register|resetting) 
      anonymous: true 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       remember_me: true 
       always_use_default_target_path: true 
       default_target_path: /dom/ 
      remember_me: 
       key:   %secret% 
      anonymous:  false 
      logout:   true 

請回答:)

+0

層級並不意味着,你是明確添加到這些角色,即當您檢查分析器你沒有看到所有的角色。這隻意味着訪問是「繼承的」。換句話說,即使您沒有分配此角色,但當您將某個操作的訪問限制爲ROLE_MODERATOR時,仍然可以通過ROLE_SUPER_ADMIN繼承訪問權限來訪問該操作。 – dbrumann

+0

好的,但如果我在做is_granted('ROLE_MODERATOR'),我將能夠訪問它?像:{%if is_granted('ROLE_MODERATOR')%}主持人{%else%}沒有版主{%endif%},在一個樹枝模板中,我可以看到版主? – Stickly

+0

我剛剛嘗試這個,它不起作用 – Stickly

回答

9

我看不出有什麼根據您提供的代碼段錯誤的,所以我做了一個小例子應用程序,讓您一步這可能會導致您發現問題的根源。

  1. 克隆symfony的標準(主)(併除去的Acme \ DemoBundle)
  2. 添加"friendsofsymfony/user-bundle": "dev-master"到composer.json
  3. 創建新的束Mahok \ SecurityBundle(php app/console generate:bundle
  4. 創建新的實體php app/console doctrine:generate:entity
  5. 根據FOS \ UserBundle文檔修改實體(步驟3;重要:將表格名稱更改爲「user」以外的內容,因爲這是一個保留字並可能導致問題!)
  6. 根據FOS \ UserBundle文檔修改app/AppKernel.php,app/config/config.yml,app/config/routing.ymlapp/config/security.yml。供參考:這是我用的是security.yml:

    jms_security_extra: 
        secure_all_services: false 
        expressions: true 
    
    security: 
        encoders: 
         FOS\UserBundle\Model\UserInterface: sha512 
    
    role_hierarchy: 
        ROLE_AUTHOR:  [ROLE_USER] 
        ROLE_MODERATOR: [ROLE_AUTHOR] 
        ROLE_ADMIN:  [ROLE_MODERATOR] 
        ROLE_SUPER_ADMIN: [ROLE_ADMIN] 
    
    providers: 
        fos_userbundle: 
         id: fos_user.user_manager 
    
    firewalls: 
        dev: 
         pattern: ^/(_(profiler|wdt)|css|images|js)/ 
         security: false 
    
        auth: 
         pattern: (^/login$|^/register|^/resetting) 
         anonymous: true 
    
        main: 
         pattern: ^/ 
         form_login: 
          provider:  fos_userbundle 
          csrf_provider: form.csrf_provider 
         logout:  true 
         anonymous: true 
    
    access_control: 
        - { path: ^/admin, role: ROLE_ADMIN } 
    
  7. 用`PHP應用程序/控制檯FOS

    的用戶:用戶:建立安全聯盟--super管理員

  8. 修改DefaultController:default.html中.twig在Mahok \ SecurityBundle,檢查{% is_granted('ROLE_MODERATOR') %}

    Hello {{ name }}! 
    {% if is_granted('ROLE_MODERATOR') %} 
    <ul> 
        {% for role in app.user.roles %} 
        <li>{{ role }}</li> 
        {% endfor %} 
    </ul> 
    {% else %} 
        oh noes! 
    {% endif %} 
    

編輯:當去到localhost /例如/ app_dev.php /你好/用戶(登錄爲「SA」)之後,我得到下面的輸出:

Hello User! 
* ROLE_SUPER_ADMIN 
* ROLE_USER 
+0

我會在幾個小時內嘗試,我會發佈一個答案 – Stickly

+0

謝謝,但我有其他問題。在我的security.yml中,爲什麼 - {path:^/admin,role:ROLE_ADMIN}不起作用? – Stickly

+0

我認爲它與您的層次結構問題有關,但正如我已經寫過的,在您提供的代碼片段中找不到任何錯誤。從security.yml中刪除不必要的內容(例如in_memory提供程序和純文本編碼器)可以減少問題的可能來源。除此之外,您應該通過FOS \ UserBundle文檔並檢查您是否意外錯過了某個步驟或出錯。例如,請參閱擴展Entity \ User而不是Document \ User,當您在IDE中依賴自動完成功能時,很容易發生這種情況。 – dbrumann