Den Zugriff auf bestimmt Aktionen einer Extension nur unter bestimmte Bedingungen zuzulassen, lässt sich mit ExtBase vglw. simpel umsetzen.
Vor dem Aufruf einer Controller Action wird in ExtBase jedesmall die „initializeAction“ des jeweiligen Controllers aufgerufen. Dies ist also eine gute Stelle für eine zentrale Zugriffsprüfung.
Um das ganze etwas flexibler zu gestallten, kann man den aktuellen „actionMethodName“ gegen einen regulären Ausdruck prüfen und bei „match“ entsprechenden Checks durchführen.
Dieses Regelnwerk hinterlegt man z.B. in einem Controller Property.
Zusammengesetzt könnte sowas dann etwa so aussehen:
protected $accessRules = array( '/editAction|updateAction/' => array('myCheck') ); protected function initializeAction() { $this->checkAccessRules(); } protected function checkAccessRules() { foreach($this->accessRules as $actionMethodNamePattern => $checks) { if (preg_match($actionMethodNamePattern, $this->actionMethodName)) { foreach($checks as $check) { if (call_user_func(array($this, $check)) === FALSE) { die('ACCESS DENIED!'); } } } } } protected function myCheck() { if (...) { $result = FALSE; } else { $result = TRUE; } return $result; } |
Im Beispiel oben wird für die Actions „editAction“ und „updateAction“ die function „myCheck“ aufgerufen. Gibt diese FALSE zurück wird mit „ACCESS DENIED!“ – gestorben ;).
Will man in der „check“ function auf Argumente der aktuellen Controller Action zugreifen muss man sich mit „$this->request->getArguments()“ behelfen und models ggf. selbst „fetchen“, da initialize Action aufgerufen wird bevor das mapping von Request Argumenten zu Controller Argumenten stattgefunden hat.
Amtlicherseit überführt man das obige Konstrukt natürlich noch in eine abstrakte Klasse, redirected auf eine seperated Action und/oder würzt links und rechts mit etwas mehr Intelligenz ;).
BTW: In FLOW3 dürfte das ganze dank AOP auch deutlich schlanker gehen.