Verfijning van toegangscontrolePrecieze toegangscontrole
De basis ACL zoals gedefineerd in de vorige sectie
laat zien hoe verschillende privileges kunnen worden toegestaan op de gehele ACL ( alle Bronnen ).
Echter in de praktijk, neigen toegangscontroles naar het hebben van uitzonderingen en gevarieerde
niveaus van complexiteit. Zend_Acl staat je toe deze verfijningen in een duidelijke en flexibele manier
te bereiken.
Voor het voorbeeld CMS, is vastgesteld dat terwijl de 'medewerker' groep de benodigheden voor het
merendeel van de gebruikers dekt, er een behoefte is aan een nieuwe 'marketing' groep die toegang
nodig heeft tot de nieuwsbrieven en het laatste nieuws in het CMS. De groep is vrij onafhankelijk
en heeft de mogelijkheid om nieuwsbrieven en het laatste nieuws te publiceren en te archiveren.
Verder, is er ook verzocht dat de 'medewerker' groep wordt toegestaan om nieuws berichten te zien,
maar ze mogen het laatste nieuws niet herzien. Als laatste, zou het voor iedereen (zelfs voor de
administrators) onmogelijk moeten zijn om nieuws aankondigingen te archiveren, omdat deze
een levensduur hebben van 1-2 dagen.
Allereerst passen we de Rol lijst aan. We hebben ontdekt dat de 'marketing' groep de zelfde basis
rechten heeft als de 'medewerkers', dus we defineren 'marketing' zo dat het de rechten overerft
van 'medewerker':
addRole(new Zend_Acl_Role('marketing'), 'medewerker');]]>
Vervolgens, zien we dat de bovenstaande toegangscontrole refereerd naar specifieke Bronnen
( o.a., "nieuwsbrief", "laatste nieuws", "Nieuws aankondigingen" ). Deze Bronnen gaan we nu toevoegen:
add(new Zend_Acl_Resource('nieuwsbrief')); // Nieuwsbrief
$acl->add(new Zend_Acl_Resource('nieuws')); // Nieuws
$acl->add(new Zend_Acl_Resource('laatste_nieuws'), 'nieuws'); // Laatste nieuws
$acl->add(new Zend_Acl_Resource('aankondiging'), 'nieuws'); // Nieuws aankondiging]]>
Dan is het enkel nog een kwestie van het defineren van deze specifieke regels op de doel gebieden van de ACL:
allow('marketing', array('nieuwsbrief', 'laatste_nieuws'), array('publiceren', 'archiveren'));
// Medewerkers ( en marketing door overerving ) worden geweigerd om het laatste nieuws te herzien
$acl->deny('medewerker', 'laatste_nieuws', 'herzien');
// Iedereen ( ook de administrators ) worden geweigerd om het nieuws aankondigingen te archiveren
$acl->deny(null, 'aankondiging', 'archiveren');]]>
We kunnen nu de ACL raadplegen met de nieuwste wijzigingen:
isAllowed('medewerker', 'nieuwsbrief', 'publiceren') ?
"toegestaan" : "geweigerd"; // geweigerd
echo $acl->isAllowed('marketing', 'nieuwsbrief', 'publiceren') ?
"toegestaan" : "geweigerd"; // toegestaan
echo $acl->isAllowed('medewerker', 'laatste_nieuws', 'publiceren') ?
"toegestaan" : "geweigerd"; // geweigerd
echo $acl->isAllowed('marketing', 'laatste_nieuws', 'publiceren') ?
"toegestaan" : "geweigerd"; // toegestaan
echo $acl->isAllowed('marketing', 'laatste_nieuws', 'archiveren') ?
"toegestaan" : "geweigerd"; // toegestaan
echo $acl->isAllowed('marketing', 'laatste_nieuws', 'herzien') ?
"toegestaan" : "geweigerd"; // geweigerd
echo $acl->isAllowed('redacteur', 'aankondiging', 'archiveren') ?
"toegestaan" : "geweigerd"; // geweigerd
echo $acl->isAllowed('administrator', 'aankondiging', 'archiveren') ?
"toegestaan" : "geweigerd"; // geweigerd]]>
Verwijderen van toegangscontrole
Om één of meer toegangregels te verwijderen van de ACL, gebruiken we simpelweg de beschikbare
removeAllow() of removeDeny() methodes. Net als bij allow()
en deny(), mag je een null waarde gebruiken om aan te geven dat het
voor alle Rollen, Bronnen en privileges geldt:
removeDeny('medewerker', 'laatste_nieuws', 'herzien');
echo $acl->isAllowed('marketing', 'laatste_nieuws', 'herzien') ?
"toegestaan" : "geweigerd"; // toegestaan
// Verwijder het toegestaan van publiceren en archiveren van nieuwsbrieven aan marketing
$acl->removeAllow('marketing', 'nieuwsbrief', array('publiceren', 'archiveren'));
echo $acl->isAllowed('marketing', 'nieuwsbrief', 'publiceren') ?
"toegestaan" : "geweigerd"; // geweigerd
echo $acl->isAllowed('marketing', 'nieuwsbrief', 'archiveren') ?
"toegestaan" : "geweigerd"; // geweigerd]]>
Privileges kunnen oplopend worden aangepast zoals je hier boven zag, maar een null waarde
voor de privileges overschrijft zo'n oplopende wijziging:
allow('marketing', 'laatste_nieuws');
echo $acl->isAllowed('marketing', 'laatste_nieuws', 'publiceren') ?
"toegestaan" : "geweigerd"; // toegestaan
echo $acl->isAllowed('marketing', 'laatste_nieuws', 'archiveren') ?
"toegestaan" : "geweigerd"; // toegestaan
echo $acl->isAllowed('marketing', 'laatste_nieuws', 'iets') ?
"toegestaan" : "geweigerd"; // toegestaan]]>