Für das Rechtesystem in meinem Tippspiel werden die Komponenten Zend_Auth und Zend_Acl im Zendframework verwendet. Zend_Auth ist dabei für die Authentifizierung registrierter Nutzer zuständig und Zend_Acl für Verteilung und das setzen der Rechte. Es wurden drei Rollen angelegt: Guest, Member und Administrator.
Die Guest Rolle hat die Möglichkeit sich den Closed-Member Bereich zu besuchen ohne dort zu agieren oder zu speichern. Der Member kann innerhalb seiner Tippgruppen alle Funktionen durchführen, hat aber keinen Zugriff auf andere Tippgruppen, was dem Administrator vorbehalten ist.
//Zugriffsberechtigungen Zend_Acl auth.salt = "lalalala" acl.roles.guest = null acl.roles.member = guest acl.roles.admin = member
- Probleme beim Rechtesystem
Das Rechtesystem von Zend_Acl basiert auf Controller Basis von Actions, für die definiert werden kann, für welche Rollen diese ausgeführt werden dürfen.
class IndexClosedController extends Zend_Controller_Action { //init() wird vor predispatch ausgeführt //Recht-Kontroller als erstes, Performance public function init() { $Actions = array( 'index'); $this->_helper->_acl->allow('member', $Actions); } //Action der View index public function indexAction() { $this->view->title = 'Meine Tippspiele'; $this->view->headTitle('Meine Tippspiele'); $this->view->playerName = $_SESSION['Zend_Auth']['storage']->name; $players = new Players(); $IdUser = $_SESSION['Zend_Auth']['storage']->id; $user = $players->fetchRow("id = {$IdUser}"); $this->view->tippgroups = $user->findManyToManyRowset('Tippgroups','Playergroups'); } }
Bsp. Rechtesystem auf Action Basis für den Closed-User-Bereich
Hier wird der Gruppe Member der Zugriff auf die Action index des indexClosedCotrollers gewährt. Durch die Vererbung der Zugriffsrechte wird auch dem Administrator ohne Erwähnung Zugriff gewährt.
Problematisch wird dieses auf Action basierende System, wenn nicht alle Parameter einer Action für den User erlaubt werden sollen, so muss ausgeschlossen werden, dass sich andere Tippgruppen tippen und ansehen kann (index und settip- Action), sondern nur die, für die er sich angemeldet hat.
class TippgroupController extends Zend_Controller_Action { protected $_tippgroupId = null; protected $_tippgroup = null; protected $_league = null; public function init() { $this->_tippgroupId = (int)$this->getRequest()->getParam('id'); //ist der Spieler in der Tippgruppe? - Berechtigung dynamisch setzen $players = new Players(); $IdUser = $_SESSION['Zend_Auth']['storage']->id; $user = $players->fetchRow("id = {$IdUser}"); $tippgroups = $user->findManyToManyRowset('Tippgroups','Playergroups'); $authorized = false; foreach ($tippgroups as $tippgroup) { if($tippgroup->id == $this->_tippgroupId) { $authorized = true; $this->_tippgroup = $tippgroup; $footDataLeagues = new FootDataLeagues(); $league = $footDataLeagues->find($this->_tippgroup->leagueID); $this->_league = $league[0]; } } //Zend_Debug::dump($tippgroups); $writeActions = array( 'index','settipp'); if($authorized) { $this->_helper->_acl->allow('member', $writeActions); } else { $this->_helper->_acl->allow('admin', $writeActions); } } public function indexAction()...