2012-06-13 17 views
6

Mam wielki problem z moim role_hierarchy,role_hierarchy z Symfony2

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

z tym, jeśli mam rolę SUPER_ADMIN będę dostał ROLE_AUTHOR, ROLE_MODERATOR, ROLE_USER I ROLE_ADMIN. Ale mój problem polega na tym, że kiedy loguję się na mojej stronie, jeśli sprawdzam profilera, widzę, że mam tylko ROLE_SUPER_ADMIN, a nie inne role, więc możesz mi pomóc?

mój widok (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> 

mój 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 

edit:

mój widok (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> 

moja 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 

odpowiedz :)

+0

Hierarchia nie oznacza, że ​​są wyraźnie dodana do tych ról, to znaczy, że kiedy sprawdź profilera, którego nie widzisz we wszystkich rolach. Oznacza to jedynie, że dostęp jest "dziedziczony".Innymi słowy, jeśli ograniczysz dostęp do działania do ROLE_MODERATOR, nawet jeśli nie masz przypisanej tej roli, nadal będziesz mógł uzyskać dostęp do akcji, ponieważ ROLE_SUPER_ADMIN dziedziczy dostęp. – dbrumann

+0

ok, ale jeśli robię is_granted ("ROLE_MODERATOR"), będę mógł uzyskać do niego dostęp? Podoba mi się: {% if is_granted ("ROLE_MODERATOR")%} moderator {% else%} no moderator {% endif%}, w szablonie gałązka, będę mógł zobaczyć moderatora? – Stickly

+0

Właśnie próbowałem tego i to nie działa – Stickly

Odpowiedz

9

nie widzę, co się dzieje z fragmentów kodu Państwo przewidziane, więc zrobiłem trochę przykładową aplikację, aby dać Ci krok po instrukcje krokowe, które mogą prowadzić do źródła problemu.

  1. sklonowany symfony standardzie (master) (i usunięte Acme \ DemoBundle)
  2. Dodany "friendsofsymfony/user-bundle": "dev-master" do composer.json
  3. Utworzono nowy pakiet Mahok \ SecurityBundle (php app/console generate:bundle)
  4. Utworzono nowy podmiot php app/console doctrine:generate:entity
  5. Zmodyfikowana jednostka zgodnie z dokumentacją FOS \ UserBundle (krok 3; Ważne: Zmień nazwę tabeli na coś innego niż "użytkownik", ponieważ jest to zastrzeżone słowo i może powodować problemy!)
  6. Zmodyfikowano app/AppKernel.php, app/config/config.yml, app/config/routing.yml i app/config/security.yml zgodnie z dokumentacją FOS \ UserBundle. Dla porównania: To security.yml używam:

    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. Utworzono użytkownika z `php fos app/console: użytkownik: tworzenie sa --super-admin

  8. Modified defaultController: default.html .twig w Mahok \ SecurityBundle, sprawdzając {% 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 %} 
    

edit: Udając localhost/Przykładem/app_dev.php/hello/Użytkownika (po zalogowaniu się jako „sa”), pojawia się następujący komunikat:

Hello User! 
* ROLE_SUPER_ADMIN 
* ROLE_USER 
+0

Spróbuję za kilka godzin, a ja napiszę odpowiedź – Stickly

+0

dzięki, ale mam inne pytania. w moim security.yml, dlaczego - {path: ^/admin, rola: ROLE_ADMIN} nie działa? – Stickly

+0

Zakładam, że jest to związane z twoim problemem z hierarchią, ale jak już napisałem, nie mogę znaleźć niczego złego w podanych fragmentach kodu. Usunięcie zbędnych elementów z security.yml (np. Dostawca in_memory i koder tekstu jawnego) zmniejsza potencjalne źródła problemu. Poza tym powinieneś przejrzeć dokumentację FOS \ UserBundle i sprawdzić, czy przypadkowo przegapiłeś krok lub popełniłeś błąd. Na przykład zobacz, czy przedłużasz Podmiot \ Użytkownik, a nie np. Dokument \ Użytkownik, który może się łatwo zdarzyć, gdy polegasz na autouzupełnianiu w swoim IDE. – dbrumann