2

Dans mon projet Symfony2, j'ai réussi à configurer FOSUserBundle + SonataUserBundle + SonataAdminBundle en suivant les documents officiels. Il est maintenant temps de configurer l'ACL (liste de contrôle d'accès).ACL + SonataAdminBundle + SonataUserBundle

Ce que je l'ai fait:

  • Création d'un AdminClass appelé AdminReport

  • sonate app/console: admin: setup-acl

    install ACL for sonata.admin.report 
    update role: ROLE_SONATA_ADMIN_REPORT_GUEST, permissions: ["LIST"] 
    update role: ROLE_SONATA_ADMIN_REPORT_STAFF, permissions: ["LIST","CREATE"] 
    update role: ROLE_SONATA_ADMIN_REPORT_EDITOR, permissions: ["OPERATOR","EXPORT"]
    • a créé un nouvel utilisateur, accordé lui avec ROLE_SONATA_ADMIN_REPORT_STAFF
    • ap sonate p/console: admin: generate-objet acl
    • connecté avec cet utilisateur et accéder par défaut/admin/tableau de bord

    Le bloc contenant le AdminReport devrait apparaître, mais ce n'est pas ... Il me manque quelque chose ?

Voici mon config.yml

sonata_admin: 
    security: 
     handler: sonata.admin.security.handler.acl 
      information: 
       GUEST: [VIEW, LIST] 
       STAFF: [EDIT, LIST, CREATE] 
       EDITOR: [OPERATOR, EXPORT] 
       ADMIN: [MASTER] 
      admin_permissions: [CREATE, LIST, DELETE, UNDELETE, EXPORT, OPERATOR, MASTER] 
      object_permissions: [VIEW, EDIT, DELETE, UNDELETE, OPERATOR, MASTER, OWNER]

EDIT J'ai essayé d'accéder directement app_dev.php/admin/app/rapport/liste avec cet utilisateur et Symfony génère une erreur Accès refusé . Le journal indique

DEBUG - Accès refusé, l'utilisateur n'est ni anonyme, ni remember-me. Et si j'accède à app_dev.php/admin/app/report/list cela fonctionne!

J'ai donc essayé de changer le gestionnaire

sonata.admin.security.handler.acl
-
sonata.admin.security.handler.roles

Cela fonctionne parce que je peux voir le bloc dans le tableau de bord d'administration. J'ai également essayé de changer

access_decision_manager: 
     strategy: unanimous 
à
affirmative
mais cela ne fonctionne pas ...

Il me manque définitivement quelque chose mais où?

+0

Ouais même problème ici, je travaille sur ce fait. Quand je l'aurai résolu, je vous donnerai une solution :) –

+0

Avez-vous reçu de nouvelles informations de votre recherche? Je suis complètement coincé avec ça ... –

+0

J'ai fait quelques ajustements autour de ça et j'ai quelque chose de fonctionnel, j'écrirai une réponse quand il me restera quelques minutes :) –

Répondre

0

Eh bien, après quelques ajustements j'ai réussi à le faire fonctionner.

D'abord, dans mon 'sonata.yml' dans app/config/ J'ai changé les perms comme ce qui suit:

app/config/sonata.yml:

sonata_admin: 
    security: 
     handler: sonata.admin.security.handler.acl 

     # acl security information 
     information: 
      # GUEST: [VIEW, LIST] 
      # STAFF: [EDIT, LIST, CREATE] 
      # EDITOR: [OPERATOR, EXPORT] 
      # ADMIN: [MASTER] 
      EDIT: EDIT 
      LIST: LIST 
      CREATE: CREATE 
      VIEW: VIEW 
      DELETE: DELETE 
      EXPORT: EXPORT 
      MASTER: MASTER 

Pour éviter cela ...

DEBUG - Accès refusé, l'utilisateur n'est ni anonyme, ni se souvient-moi

...J'ai commenté ce qui suit, parce que je pense que l'électeur pare-feu bloque l'accès à mon utilisateur. Peut-être pas la solution plus sage, mais fonctionne bien pour l'instant :)

app/config/security.yml:

# set access_strategy to unanimous, else you may have unexpected behaviors 
# access_decision_manager: 
#  strategy: unanimous 

Notez que mon application est construite uniquement autour de la dahboard d'administration, de sorte que chaque l'utilisateur doit avoir l'accès au tableau de bord lors de sa création. De cette façon, j'ai modifié mon utilisateur constructeur comme ceci:

src/Application/Sonata/UserBundle/Entité/User.php:

class User extends BaseUser 
{ 
    /** 
    * @var integer $id 
    */ 
    protected $id; 

    public function __construct() { 
     parent::__construct(); 
     // your own logic 
     $this->roles = array('ROLE_USER', 'ROLE_SONATA_ADMIN', 'ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT'); 
    } 

    /** 
    * Get id 
    * 
    * @return integer $id 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

EDIT: Il semble que, sans le savoir, j'ai répondu à une autre de vos questions ^^ " (How can I assign default role to user in Symfony2)

Maintenant, chaque utilisateur peut accéder au tableau de bord, mais comme votre problème, ils ne peuvent rien voir.

J'avais besoin d'utiliser ACL, mais comme les rôles mes utilisateurs appartiennent à des groupes qui ont leur propre ACL.

Une fois que mon utilisateur appartient à un ou plusieurs groupes, il a obtenu les permissions de groupes en plus de ses propres permissions.

En gérant les autorisations d'un groupe, chaque utilisateur appartenant à ce groupe a ses autorisations modifiées. Et en éditant les permissions d'un utilisateur, je peux lui faire accéder à certaines pages qu'un groupe n'autorisera pas.

Par exemple:

     ┌─────────────┐ 
         │ GROUP_1 │     ┌───────────────┐ 
         ├─────────────┤     │  USER_1 │ 
         │ CAT2_VIEW │     │ applied perms │ 
         │ CAT2_LIST │     ├───────────────┤ 
         │ CAT2_EDIT │     │ CAT1_VIEW  │ 
         │ CAT2_DELETE │     │ CAT1_LIST  │ 
         ├─────────────┤     ├───────────────┤ 
         │ CAT3_VIEW │ ├────┐   │ CAT2_VIEW  │ 
┌─────────────┐   │ CAT3_LIST │  │   │ CAT2_LIST  │ 
│ USER_A │   │ CAT3_EDIT │  │   │ CAT2_EDIT  │ 
├─────────────┤<────────┤ CAT3_DELETE │  │   │ CAT2_DELETE │ 
│ CAT1_VIEW │   └─────────────┘  │   ├───────────────┤ 
│ CAT1_LIST │        ├────> │ CAT3_VIEW  │ 
│    │   ┌─────────────┐  │   │ CAT3_LIST  │ 
│    │<────────┤ GROUP_2 │  │   │ CAT3_EDIT  │ 
└─────────────┘   ├─────────────┤  │   │ CAT3_DELETE │ 
         │ CAT4_VIEW │  │   ├───────────────┤ 
         │ CAT4_LIST │  │   │ CAT4_VIEW  │ 
         │ CAT4_EDIT │ ├────┘   │ CAT4_LIST  │ 
         │ CAT4_DELETE │     │ CAT4_EDIT  │ 
         │ CAT4_EXPORT │     │ CAT4_DELETE │ 
         └─────────────┘     │ CAT4_EXPORT │ 
                 └───────────────┘ 

j'ai réussi à le faire fonctionner de cette façon, comme je voulais, mais je ne sais pas si cela est la meilleure solution pour votre problème. J'espère que cela va vous aider :)

PS: Si quelqu'un voit une erreur ou une chose illogique, n'hésitez pas à me dire dans le commentaire, je suis encore en train d'apprendre à l'utiliser, et ce sera utile :)

0

Le PermissionMap de SonataAdminBundle étend BasicPermissionMap de Symfony. Seulement si vous changez cette configuration par défaut, l'AclVoter supporte les attributs 'LIST' et 'EXPORT' et peut éventuellement voter pour accorder les permissions voulues.

parameters: 
    security.acl.permission.map.class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap 

Voir ma réponse à AclVoter denies access to 'LIST'