Zend Framework

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-11-2017 10:38:52

RomainG
Membre
Date d'inscription: 10-06-2015
Messages: 62

ACL génériques et ACL clients

Bonjour,

dans le cadre d'une grosse refonte de notre plateforme en vue du passage sous ZF3, je souhaite revoir notre utilisation des ACL.

Dans l'état actuel des choses, nous avons, au niveau du dossier "config" cette architecture :

- config
---- autoload
-------- client1
-------- client2

Dans chaque dossier client, il existe un fichier acl.client.php qui défini la configuration des acl pour ce client.
Il apparaît que chaque fichier acl.client.php est à peu de chose près identique pour chaque client, avec tout de même quelques spécificités (assertions différentes, ressources autorisées ou non...).

Ce que je souhaiterais, c'est avoir un fichier acl.global.php avec les différentes règles communes aux clients dans le dossier autoload et un fichier acl.client.php qui contient les règles propres à ce client dans le dossier correspondant.

Malheureusement, les règles ne sont pas écrasées lors du merge des deux fichiers et je me retrouve donc avec des incohérences au niveau des ACL.


Existerait-il une meilleure solution pour palier à ce problème ?

Merci d'avance pour vos réponse.
Romain

Hors ligne

 

#2 02-11-2017 12:23:27

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 416

Re: ACL génériques et ACL clients

Salut

- Tes fichiers acl client sonts chargé sous la même clé que tes acl global ?
- Peux tu synthétiser un exemple entre ton global et deux clients pour voir comment sa se passe au niveau du merge ?


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 02-11-2017 14:16:17

RomainG
Membre
Date d'inscription: 10-06-2015
Messages: 62

Re: ACL génériques et ACL clients

Salut,

effectivement, les fichiers acl clients sont chargé avec la même clé que les acl globaux.

Voici à quoi ressemble le fichier des acl globaux :

Code:

[lang=php]
return [
    'acl' => [
        'role' => [
             // liste de mes différents rôles utilisateurs
             ['guest'],
             ['user', 'guest'],
        ],
        'resource' => [
             // liste de mes ressources (controllers)
            'auth',
            'category'
        ],
        'rule' => [
            'allow' => [
                 [array('guest'), 'auth', array('index'), 'myGlobalAssertion'],
                 [array('guest'), 'category', array('index')],
            ],
            'deny' => [
                  // liste du même type que la clé 'allow'
            ]
        ]
    ]
]

Pour mes acl clients, j'ai ceci :

Code:

[lang=php]
return [
    'acl' => [       
        'rule' => [
            'allow' => [
                 [array('guest'), 'auth', array('index'), 'myClientAssertion'],
            ],
            'deny' => [
                  // liste du même type que la clé 'allow'
            ]
        ]
    ]
]

Une fois que le merge a été réalisé, j'ai quelque chose du style :

Code:

[lang=php]
return [
    'acl' => [
        'role' => [
             // liste de mes différents rôles utilisateurs
        ],
        'resource' => [
             // liste de mes ressources (controllers)
            'auth',
            'category'
        ],
        'rule' => [
            'allow' => [
                 [array('guest'), 'auth', array('index'), 'myGlobalAssertion'], // clé en double
                 [array('guest'), 'category', array('index')],
                 [array('guest'), 'auth', array('index'), 'myClientAssertion'], // clé en double
            ],
            'deny' => [
                  // liste du même type que la clé 'allow'
            ]
        ]
    ]
]

Comme tu peux le constater, je me retrouve avec la clé [array('guest'), 'auth', array('index')] en double dans mon fichier final.

Ce que je souhaiterais, c'est que les clés présentes dans le fichier acl client se retrouvent à la place de celles présentes dans le fichier acl global.

J'ai pensé utiliser l'event EVENT_MERGE_CONFIG pour faire le tri sur ces clés mais impossible de faire quelque chose de générique...

Hors ligne

 

#4 03-11-2017 07:45:05

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 416

Re: ACL génériques et ACL clients

Pour arriver a tes fins, il faut comprendre comment fonctionne :
http://php.net/manual/fr/function.array … ursive.php

c'est la clé pour réussir ce que tu essaye de faire.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#5 03-11-2017 08:49:08

RomainG
Membre
Date d'inscription: 10-06-2015
Messages: 62

Re: ACL génériques et ACL clients

Salut,

je connais bien cette fonction et comme on dit, la nuit porte conseil.

Ce que j'ai pensé faire, c'est de récupérer les deux fichiers, faire un array_merge_recursive et ensuite d'injecter le tableaux final dans la config au niveau de l'event EVENT_MERGE_CONFIG, en ayant préalablement supprimé la clé...

Penses-tu que ce soit une bonne solution à moins qu'on puisse récupérer les fichiers de config sur un autre event, mais je n'ai pas vu dans la doc qu'il y en avait d'autres avant celui-ci ?

Hors ligne

 

#6 03-11-2017 09:59:33

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 416

Re: ACL génériques et ACL clients

Ce qu'il te faudrait c'est cela :

Code:

[lang=php]

$array1 = [
    'acl' => [
        'role' => [
             // liste de mes différents rôles utilisateurs
             ['guest'],
             ['user', 'guest'],
        ],
        'resource' => [
             // liste de mes ressources (controllers)
            'auth',
            'category'
        ],
        'rule' => [
            'allow' => [
                 [array('guest'), 'auth', array('index'),'myGlobalAssertion'],
                 [array('guest'), 'category', array('index')],
            ],
            'deny' => [
                  // liste du même type que la clé 'allow'
            ]
        ]
    ]
];

$array2 = [
    'acl' => [       
        'rule' => [
            'allow' => [
                 [array('guest'), 'auth', array('index'), 'myClientAssertion'],
            ],
            'deny' => [
                  // liste du même type que la clé 'allow'
            ]
        ]
    ]
];

$merged = array_replace_recursive($array1, $array2);
echo '<pre>';
var_export($merged);

mais le soucis reste de regénérer le tableau de config avec celui la.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#7 03-11-2017 14:32:40

RomainG
Membre
Date d'inscription: 10-06-2015
Messages: 62

Re: ACL génériques et ACL clients

Salut,

après de nombreuses tentatives, je n'arrive pas à avoir un tableau final cohérent.
J'ai dans un premier temps déterminé l'ensemble de mes règles ACL communes à mes différents clients et je les ai mises dans le fichier acl.global. Ensuite, pour chaque client, j'ai supprimé ces règles des fichiers acl.client pour ne laisser que les règles particulières au client.

Malheureusement, quand j'applique la fonction array_replace_recursive, je me retrouve avec un tableau final très bizarre.
De ce que j'a pu comprendre sur le fonctionnement de cette fonction, c'est qu'il y a en premier lieu une comparaison avec les index des tableaux. Le problème pour moi, c'est que mes tableaux (['rule']['allow'] et ['rule']['deny']) ont une taille différente entre les deux fichiers...

Si je prends par exemple une règle du fichier acl.global :

Code:

[lang=php]
'deny' => [
    [ [ 'guest' ] ],
    [ [ 'prestataire' ], 'menu_manager' ],
    [ [ 'controller' ], 'holder', [ 'add', 'addoldpass' ] ],
]

et un fichier acl.client :

Code:

[lang=php]
'deny' => [
    [ [ 'controller' ], 'stockcommand' ],
]

Je me retrouve avec un tableau du style :

Code:

[lang=php]
'deny' => [
    [ [ 'guest' ], 'stockcommand' ], // abbération
    [ [ 'prestataire' ], 'menu_manager' ],
    [ [ 'controller' ], 'holder', [ 'add', 'addoldpass' ] ],
]

Alors que j'aimerais avoir un tableau comme ceci :

Code:

[lang=php]
'deny' => [
    [ [ 'guest' ]], 
    [ [ 'prestataire' ], 'menu_manager' ],
    [ [ 'controller' ], 'holder', [ 'add', 'addoldpass' ] ],
    [ [ 'controller' ], 'stockcommand' ],
]

Je vais poursuivre mes recherches afin de trouver une solution à ce problème !

PS : pour ce qui est de régénérer le tableau de config avec cet hypothétique tableau, il suffit de voir la doc : https://framework.zend.com/manual/2.4/e … figuration

Romain

Hors ligne

 

#8 03-11-2017 15:02:23

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 416

Re: ACL génériques et ACL clients

Je vois.

En fait je pense que tu vas devoir faire un service\listener\autre truc du genre qui te permettent d'avoir ton tableau cohérent avec des règles bien précise.

Ton tableau commun, que tu surcharge avec tes règles clients s'il y en as.
Tu repasses donc tes tableaux dans une sorte d'algo de surcharge et tu l'injecte ensuite dans ton event OnMergeConfig.

Petite question en passant, au moment de la config comment fais tu pour retrouver le contexte de ton client ? C'est quand même super tôt.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#9 03-11-2017 15:24:00

RomainG
Membre
Date d'inscription: 10-06-2015
Messages: 62

Re: ACL génériques et ACL clients

J'essaye de surchargé mon tableau acl.global avec le tableau acl.client mais les résultats ne sont pas bon pour l'instant !!! Je vais quand même poursuivre dans cette voie car je pense que c'est le seul moyen pour avoir un tableau correct !


Pour récupérer le contexte de mon client, je défini une constante avec le nom de mon client au niveau du index.php. Chaque client à un index.php particulier, ce qui permet de récupérer de manière dynamique les configs, même avant l'init de l'application !

Hors ligne

 

#10 03-11-2017 16:00:18

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 66

Re: ACL génériques et ACL clients

Bonjour RomainG,

je pense que ce genre de code peux être une solution (je ne l'ai pas testé, si cela ne fonctionne pas je le testerais ce soir), mais si je me souviens bien du comportement de ce merge avec le dernier paramètre à true, c'est qu'il remplace les entrée en fonction des clé du tableau qu'elles soient numérique ou pas.

Code:

Zend\Stdlib\ArrayUtils::merge(
    include 'config/autoload/acl.global.php',
    include 'config/autoload/acl.client.php',
    true
);

En espérant t'avoir aidé.

Cordialement

Hors ligne

 

#11 03-11-2017 16:27:47

RomainG
Membre
Date d'inscription: 10-06-2015
Messages: 62

Re: ACL génériques et ACL clients

Salut shishi, j'ai déjà testé cette fonction mais cela ne fonctionne pas (j'ai le même résultat que ce que j'ai montré avant).

Par contre, j'ai résolu mon problème, au moins avec un client ! A voir si cela fonctionne avec les autres...

Ce que j'ai fait, c'est que je parcours les deux tableaux (client et global) et je compare chaque paire de clé/valeur. Si elle existe uniquement dans le client, je l'ajoute au tableau final. Si elle existe aussi dans le global, le fait une comparaison plus poussée (comparaison avec les "ressources", puis avec les privilèges, puis avec les assertions si besoin).

Merci pour vos aides wink

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages