2012-06-13 15 views
6

ich ein großes Problem mit meinem role_hierarchy haben,role_hierarchy mit Symfony2

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

mit, dass, wenn ich die super_admin Rolle bekam, ich werde die ROLE_AUTHOR, ROLE_MODERATOR, ROLE_USER UND ROLE_ADMIN bekam. Aber mein Problem ist, wenn ich mich auf meiner Website anmelde, wenn ich den Profiler überprüfe, kann ich sehen, dass ich nur die ROLE_SUPER_ADMIN, nicht die anderen Rollen, also, kannst du mir helfen?

meiner Sicht (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> 

meine 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:

meiner Sicht (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> 

meine 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 

bitte antworten :)

+0

Die Hierarchie bedeutet nicht, dass Sie explizit auf diese Rollen hinzugefügt werden, das heißt, dass, wenn Sie Überprüfen Sie den Profiler, wenn Sie nicht alle Rollen sehen. Es bedeutet nur, dass der Zugriff "vererbt" wird.Mit anderen Worten, wenn Sie den Zugriff auf eine Aktion auf ROLE_MODERATOR beschränken, obwohl Sie diese Rolle nicht zugewiesen haben, können Sie weiterhin auf die Aktion zugreifen, da ROLE_SUPER_ADMIN den Zugriff erbt. – dbrumann

+0

ok, aber wenn ich is_granted ('ROLE_MODERATOR') mache, kann ich darauf zugreifen? Wie: {% if is_granted ('ROLE_MODERATOR')%} Moderator {% else%} Kein Moderator {% endif%}, in einer Zweigvorlage kann ich den Moderator sehen? – Stickly

+0

Ich habe es gerade versucht und es funktioniert nicht – Stickly

Antwort

9

Ich kann nicht sehen, was aus dem Code-Schnipsel nicht stimmen Sie zur Verfügung gestellt, so habe ich eine kleine Beispiel-Anwendung, um Sie einen Schritt Schritt-Anweisung, die Sie zur Quelle des Problems führen könnte.

  1. Geklonte symfony-Standard (Master) (und entfernt Acme \ DemoBundle)
  2. Added "friendsofsymfony/user-bundle": "dev-master"
  3. Erstellt neues Bündel Mahok \ SecurityBundle (php app/console generate:bundle)
  4. Erstellt neue Entity php app/console doctrine:generate:entity
  5. composer.json
  6. Modifizierte Entität gemäß FOS \ UserBundle-Dokumentation (Schritt 3; Wichtig: Ändern Sie den Tabellennamen in einen anderen Namen als "Benutzer", da dies ein reserviertes Wort ist und Probleme verursachen kann!)
  7. Geändert app/AppKernel.php, app/config/config.yml, app/config/routing.yml und app/config/security.yml gemäß FOS \ UserBundle-Dokumentation. Als Referenz: Dies ist die security.yml ich benutze:

    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 } 
    
  8. Erstellt Benutzer mit `PHP app/console fos: user: create sa --Superabsorptionsmittel-admin

  9. Modified default: default.html .twig in Mahok \ SecurityBundle, die Überprüfung für {% 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: Wenn man sich auf localhost/Beispiel/app_dev.php/hallo/User (nach als „sa“ anmelden), erhalte ich die folgende Ausgabe:

Hello User! 
* ROLE_SUPER_ADMIN 
* ROLE_USER 
+0

Ich werde es in ein paar Stunden versuchen und ich werde eine Antwort schreiben – Stickly

+0

danke, aber ich habe andere Fragen. in meiner security.yml, warum - {Pfad: ^/admin, Rolle: ROLE_ADMIN} funktioniert nicht? – Stickly

+0

Ich nehme an, es hängt mit Ihrem Problem mit der Hierarchie zusammen, aber wie ich bereits geschrieben habe, kann ich in den von Ihnen bereitgestellten Code-Schnipsel nichts falsch finden. Das Entfernen der unnötigen Sachen von security.yml (z. B. der in_memory-Provider und Klartext-Encoder) reduziert mögliche Quellen für Ihr Problem. Ansonsten sollten Sie die FOS \ UserBundle-Dokumentation durchgehen und prüfen, ob Sie versehentlich einen Schritt verpasst oder einen Fehler gemacht haben. Sehen Sie zum Beispiel nach, ob Sie Entity \ User und nicht z. Document \ User, was leicht passieren kann, wenn Sie in Ihrer IDE auf Autovervollständigung setzen. – dbrumann