2012-06-13 27 views
6

Tôi có một vấn đề lớn với role_hierarchy tôi,role_hierarchy với Symfony2

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

với điều đó, nếu tôi đã nhận vai trò SUPER_ADMIN, tôi sẽ nhận được các ROLE_AUTHOR, ROLE_MODERATOR, ROLE_USER VÀ ROLE_ADMIN. Nhưng vấn đề của tôi là khi tôi đăng nhập trên trang web của mình, nếu tôi kiểm tra hồ sơ, tôi có thể thấy tôi chỉ nhận được ROLE_SUPER_ADMIN, chứ không phải vai trò khác, vì vậy, bạn có thể giúp tôi không?

quan điểm của tôi (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> 

tôi security.yml (app/config)

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 

chỉnh sửa:

quan điểm của tôi (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 tôi (app/config)

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 

hãy trả lời :)

+0

Phân cấp không có nghĩa là bạn được thêm rõ ràng vào các vai trò này, tức là khi bạn kiểm tra profiler bạn không thấy tất cả các vai trò. Nó chỉ có nghĩa là, truy cập được "kế thừa".Nói cách khác, khi bạn hạn chế quyền truy cập vào một hành động đối với ROLE_MODERATOR, ngay cả khi bạn không được chỉ định vai trò này, bạn vẫn có thể truy cập hành động khi ROLE_SUPER_ADMIN kế thừa quyền truy cập. – dbrumann

+0

ok, nhưng nếu tôi đang làm is_granted ('ROLE_MODERATOR'), tôi sẽ có thể truy cập vào nó? Giống như: {% if is_granted ('ROLE_MODERATOR')%} người kiểm duyệt {% else%} không có người kiểm duyệt {% endif%}, trong mẫu ghép, tôi có thể xem người kiểm duyệt? – Stickly

+0

Tôi vừa thử điều này và nó không hoạt động – Stickly

Trả lời

9

Tôi không thể nhìn thấy gì sai từ các đoạn mã mà bạn cung cấp, vì vậy tôi làm một ứng dụng ví dụ nhỏ để cung cấp cho bạn một bước bằng cách hướng dẫn từng bước có thể dẫn bạn đến nguồn gốc của vấn đề.

  1. nhân bản vô tính symfony tiêu chuẩn (thạc sĩ) (và loại bỏ Acme \ DemoBundle)
  2. Added "friendsofsymfony/user-bundle": "dev-master" để composer.json
  3. Created bó mới Mahok \ SecurityBundle (php app/console generate:bundle)
  4. Tạo mới Entity php app/console doctrine:generate:entity
  5. Thực thể đã sửa đổi theo tài liệu FOS \ UserBundle (bước 3; Quan trọng: Thay đổi tên bảng thành tên khác "người dùng", vì đây là từ dành riêng và có thể gây rắc rối!)
  6. Đã sửa đổi app/AppKernel.php, app/config/config.yml, app/config/routing.ymlapp/config/security.yml theo tài liệu FOS \ UserBundle. Để tham khảo: Đây là security.yml tôi sử dụng:

    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. người dùng tạo với `php ứng dụng/console fos: hướng dẫn: tạo sa --super-admin

  8. Modified DefaultController: default.html .twig trong Mahok \ SecurityBundle, kiểm tra {% 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 %} 
    

chỉnh sửa: Khi đi vào localhost/example/app_dev.php/hello/Người dùng (sau khi đăng nhập là "sa"), tôi nhận được kết quả sau:

Hello User! 
* ROLE_SUPER_ADMIN 
* ROLE_USER 
+0

Tôi sẽ thử trong vài giờ và tôi sẽ gửi một câu trả lời – Stickly

+0

cảm ơn, nhưng tôi có câu hỏi anothers. trong security.yml của tôi, tại sao - {path: ^/admin, role: ROLE_ADMIN} không hoạt động? – Stickly

+0

Tôi cho rằng nó liên quan đến vấn đề của bạn với cấu trúc phân cấp, nhưng như tôi đã viết, tôi không thể tìm thấy bất kỳ điều gì sai trong đoạn mã bạn đã cung cấp. Xóa các nội dung không cần thiết khỏi security.yml (ví dụ: nhà cung cấp in_memory và bộ mã hóa văn bản rõ ràng) sẽ giảm các nguồn có thể xảy ra cho sự cố của bạn. Ngoài ra, bạn nên xem qua tài liệu FOS \ UserBundle và kiểm tra xem liệu bạn có vô tình bỏ lỡ một bước hay mắc lỗi hay không. Ví dụ: xem liệu bạn có mở rộng Entity \ User hay không, thay vì ví dụ: Document \ User, có thể dễ dàng xảy ra khi bạn dựa vào tự động hoàn thành trong IDE của bạn. – dbrumann