Wie heeft er ervaring met de Zend Acl permission module en kan mij vertellen waarom het niet werkt o

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nkamp Kamp van de

nkamp Kamp van de

11/06/2017 23:30:22
Quote Anchor link
Hallo,


Ik werk aan een applicatie waar de Zend Acl permission module (ik denk versie 1) toegepast is. Zij zetten het o.a. voor het menu. Nu moet ik het menu aanpassen van simpel 2 dimensionaal (parent-child) naar een multi-level dropdown menu. Het menu zelf werkt uitstekend maar nu moet ik het laten aansluiten op de bestaande Zend Acl module

Step 1: definiëren van de rollen:
Dit laat ik ongewijzigd, want dit is niet veranderd. Momenteel wordt iedere bestaande rol toegevoegd met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$this
->addRole(new Zend_Acl_Role($role->name), $parent);
?>

($parent is Always null)

Step 2: definiëren van de resources:

Dit moet ik aanpassen. Ieder menu-item voeg ik als resource toe en dat doe recursive zoals:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if ($item->parent_id == 0) {
   if (!empty($item->menu_code))
      $this->addResource(new Zend_Acl_Resource($item->menu_code));
}
else {
// Add the menu-item as resource
  if (!empty($item->menu_code))
    $this->addResource(new Zend_Acl_Resource($item->menu_code), $parent_menucode);
}

?>

Ik voeg dus ieder menu item toe als resource maar voor de test gaat het mij om de volgende 3:
Uid | menucode | parentid | parent menucode
1 | DBEH_Data_Beheer | 0 |
45 | DBEH_ANALYSIS | 1 | DBEH_Data_Beheer
47 | DBEH_ANALYSIS_Upl | 45 | DBEH_ANALYSIS

((voordat ik de AddResource method aanroep echo ik de signatuur, dus dit is wat de method in gaat)

Step 3: Definiëren van de 'allow' rule lijst:
Ik wil voor een specifieke rol het menu-item 'DBEH_ANALYSIS_Upl' tonen is allow. Dit is een child van DBEH_ANALYSIS welke weer een child is van DBEH_Data_Beheer (root). Ik denk dat ik dat goed gedaan heb op de volgende manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$this
->allow($role_name, $resource_name, $privilege);
?>


Resultaat:
(Voordat ik de allow aanroep echo ik de signatuur:)
role | menucode | privilege
ESG | DBEH_ANALYSIS | view
ESG | DBEH_ANALYSIS_Upl | view
ESG | DBEH_Data_Beheer | view

Dit interpreteer ik als dat de rol ESG enkel toegang heeft tot deze drie menu-items. Ik weet niet mijn interpretatie/aanname correct is?

Step 4: Checking of een resource 'isAllowed' for een specifiek menu item:

Ik ittereer door alle menu-items en voordat ik hem aan het menu toevoeg check ik of de resource voor deze rol 'isAllowed' is. ($resource = menucode, $privilege is altijd 'view')
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
public function isAllowedByUser($resource, $privilege) {
        return parent::isAllowed($_SESSION['RoleName'], $resource, $privilege);
    }

?>


Mijn verwachting is nu dat als een menu-item resource bestaat in de Alow lijst, deze functie true retouneert. Indien deze niet voorkomt in de Allow lijst retouneert deze functie false.

Helaas dit is niet wat er gebeurd. Hoewel er maar 3 menu-items in de allow rules lijst staan, retouneert deze functie voor ieder menu-item onder de root DBEH_Data_Beheer true (=1). Waarom!!!!!!???????
En als ik DBEH_Data_Beheer uit de Allow lijst verwijder, wordt er geen enkel menu-item onder deze root getoond, wat dan wel begrijp.

Heeft iemand een idee waar ik de fout in ga, waar ik mijn verwachtingspatroon moet bijstellen?

Ik hoop dat iemand mij hiermee kan helpen.

Ik echo nu de resource, Allow signatuur voordat ik deze methods aanroep.
Wat ik graag zou willen is dat ik één of andere manier kan zien welke resources en de allow rules list van de Acl module kan opvragen/tonen.

Natuurlijk heb ik bij Zend gekeken en dan doe ik het zoals het daar beschreven staat, dat denk ik in ieder geval. Maar weet iemand nog een goed voorbeeld evt. van een multi-level menu?


Bedankt,

Nico
Gewijzigd op 11/06/2017 23:39:21 door Nkamp Kamp van de
 
PHP hulp

PHP hulp

18/04/2024 09:40:08
 
Thomas van den Heuvel

Thomas van den Heuvel

12/06/2017 13:50:57
Quote Anchor link
Zou dat niet $item->parent_menucode moeten zijn in het tweede fragment? Ik snap echter niet helemaal wat het doel hiervan is? Dit is redundante informatie. Het is letterlijk de menucode van het parent-item :p. Ook zie ik niet helemaal hoe het parent-item bepaalt of een (child) item getoond wordt?

Tenzij je heel verschillende dingen kunt afhankelijk van je rol zal het menu inhoudelijk niet veel verschillen en kun je volstaan met één complete boomstructuur (en anders zou je kunnen overwegen om meerdere menu's te maken die meer zijn afgestemd op een rol?). Deze zou je dan kunnen doorlopen en on-the-fly uit kunnen rekenen welke items getoond zouden moeten worden. Je zou daarbij bijvoorbeeld een soort van whitelist van item-id's kunnen opbouwen. Bij het weergeven van de boom doorloop je gewoon de hele boom maar laat je deze whitelist bepalen of een item daadwerkelijk getoond wordt of niet.

Wanneer je onvoldoende rechten hebt om parent item X te zien, dan zullen onderliggende items ook niet getoond worden, ook al heb je daar mogelijk wel voldoende rechten voor. Het gaat dus als het ware om hoe ver je het pad vanaf de root naar het item kunt afwandelen. Elke stap op dit pad controleer je of je voldoende privileges hebt. Als een item vanaf de root niet "bereikbaar" is, wordt deze niet getoond.
 
Nkamp Kamp van de

nkamp Kamp van de

22/06/2017 16:40:03
Quote Anchor link
Hallo Thomas,

Bedankt voor je reactie.

Nee, het betreft een multi-level menu wat ik met PHP opbouw door de functie recursive aan te reopen. In de signatuur zit o.a. $parentid waarvan ik dan alle childs ophaal en deze aan de 'string' toevoeg. Dit echo ik en er staat een mooi menu op het scherm. Dit werkt goed.
Goed opgemerkt $item->parent_menucode, maar $parentid is goed, omdat deze uit de aanroep van de functie mee komt.

Het geeft een zeer onbevredigend gevoel dat ik 'denk' het geïmplementeerd te hebben zoals Acl bedoeld is, maar dat het niet werkt.

Om verder te kunnen had ik al iets als workaround bedacht. Ik heb nl. een scherm erbij gebouwd (wat er niet was) waarmee ik voor iedere rol het menu item kan autoriseren. Deze join ik met het menu opbouwen en dit werkt voor nu ook. Of dit de juiste manier van menu autorisatie is weet ik niet. Het betreft een interne applicatie.

Maar mocht iemand mij nog met tips of ideeën kunnen voorzien mbt. Acl, dan hou ik mij gaarne aanbevolen. Bv. hoe kun je analyseren wat er ontbreekt, waar het mis gaat!!!???

Bedankt,

Nico
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.