2012-06-13 18 views
6

Tengo un gran problema con mi role_hierarchy,role_hierarchy con Symfony2

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

con eso, si me dieron el papel super_admin, que se consiguió el ROLE_AUTHOR, ROLE_MODERATOR, ROLE_USER Y ROLE_ADMIN. Pero mi problema es que cuando inicio sesión en mi sitio web, si reviso el generador de perfiles, puedo ver que solo obtuve ROLE_SUPER_ADMIN, no los otros roles, entonces, ¿pueden ayudarme?

mi punto de vista (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> 

mi 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 

edición:

mi punto de vista (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> 

mi 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 

Por favor, conteste :)

+0

La jerarquía no significa, que está añadido explícitamente a estas funciones, es decir, que cuando se revisa el generador de perfiles que no ves todos los roles. Solo significa que el acceso es "heredado".En otras palabras, cuando restringe el acceso a una acción a ROLE_MODERATOR, aunque no tenga asignada esta función, aún puede acceder a la acción, ya que ROLE_SUPER_ADMIN hereda el acceso. – dbrumann

+0

bien, pero si estoy haciendo is_granted ('ROLE_MODERATOR'), ¿podré acceder a él? Me gusta: {% if is_granted ('ROLE_MODERATOR')%} moderator {% else%} no moderator {% endif%}, en una plantilla twig, podré ver al moderador? – Stickly

+0

Solo lo he intentado y no funciona – Stickly

Respuesta

9

no puede ver lo que está mal de los fragmentos de código que nos ha facilitado, por lo que hizo una pequeña aplicación de ejemplo para darle paso a una instrucciones paso a paso que pueden llevarlo a la fuente del problema.

  1. clonada Symfony estándar (maestro) (y eliminado Acme \ DemoBundle)
  2. Agregado "friendsofsymfony/user-bundle": "dev-master" a composer.json
  3. Creado nuevo paquete Mahok \ SecurityBundle (php app/console generate:bundle)
  4. creado nuevas Entidad php app/console doctrine:generate:entity
  5. Entidad modificada de acuerdo con la documentación de FOS \ UserBundle (paso 3; Importante: cambie el nombre de la tabla a algo que no sea "usuario", ya que es una palabra reservada y podría causar problemas)
  6. Modificado app/AppKernel.php, app/config/config.yml, app/config/routing.yml y app/config/security.yml de acuerdo con la documentación de FOS \ UserBundle. A modo de referencia: Este es el security.yml que utilizo:

    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. creado por el usuario con `php fos aplicación/consola: Usuario: Cree sa-admin opción '--super'

  8. Modificado defaultController: default.html .twig en Mahok \ SecurityBundle, la comprobación de {% 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 %} 
    

edición: Cuando va a localhost/ejemplo/app_dev.php/hola/usuario (después de iniciar sesión como "sa"), consigo el siguiente resultado:

Hello User! 
* ROLE_SUPER_ADMIN 
* ROLE_USER 
+0

Lo intentaré en unas pocas horas y publicaré una respuesta – Stickly

+0

gracias, pero tengo otras preguntas. en mi security.yml, ¿por qué - {path: ^/admin, role: ROLE_ADMIN} no funciona? – Stickly

+0

Supongo que está relacionado con su problema con la jerarquía, pero como ya escribí, no puedo encontrar nada incorrecto en los fragmentos de código que proporcionó. Eliminar las cosas innecesarias de security.yml (por ejemplo, el proveedor in_memory y el texto plano-codificador) reduce las posibles fuentes de su problema. Aparte de eso, debe revisar la documentación de FOS \ UserBundle y verificar si accidentalmente se perdió un paso o cometió un error. Por ejemplo, consulte si extiende Entity \ User, en lugar de, por ejemplo, Documento \ Usuario, que puede suceder fácilmente cuando confía en autocompletar en su IDE. – dbrumann