modifica: questo è un complemento della risposta di @singles.
Devi capire che ci sono 2 cose diverse. Auth e Acl. Auth ti dice chi è l'utente e puoi ad esempio reindirizzare l'utente che non ha Auth al tuo login controller e impostare un auth identity dopo il login. allora il sistema Acl prendere sì/no decisioni basate sui dati Auth (potrebbe essere l'id utente o è il ruolo, memorizzati nella memoria Auth.
Sulla bella soluzione è quella di avere 2 controllori plugin (registrato in buona ordine sul bootstrap, Auth quindi Acl.) Se non si utilizzano i plug-in Controller, sarà necessario richiamare l'Acl in ogni controller, se necessario, se necessario, quindi utilizzare i plug-in.
Implementare il preDispatch()
in voi Auth plug-in per impostare ad esempio un'identità anonima se non si dispone di ritorno di identità da Zend_Auth. Si tratta di un frammento di codice di un vero e proprio:
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
// set a default anonymous identity
$auth->getStorage()->write(array('name' => 'anonymous','role' => 1,));
}
(...)
E per la Acl controllore plug Il compito è pure in preDispatch()
. È possibile avviare un controllo ACL per ogni URL richiesto (quindi per ogni richiesta utente, anche ajax). Ecco un frammento parziale, quindi questo solo un esempio di come si possa gestire le cose:
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$controller = $request->controller;
$module = $request->module;
$action = $request->action;
// here you should code something nice retrieving you Zend_Acl object
// with some caching options maybe, building roles, ressources, etc
$this->_acl = $this->getAcl();
if (!$this->_acl->isCurrentUserAllowed($module,'see')) {
$auth = Zend_Auth::getInstance();
$identity = $auth->hasIdentity('identity')? $auth->getIdentity() : null;
if(isset($identity)) {
if($identity['name'] == 'anonymous') {
// WARNING: avoid infinite redirect loops on login page
if (!($request->getControllerName() == 'login'
&& $request->getActionName()=='login'
&& $request->getModuleName() == 'default')) {
$request->setControllerName('login')
->setActionName('login')
->setModuleName('default');
return;
(...)
e in questo sistema l'ultima parte importante è il LoginController dove in caso di login di successo si dovrebbe initate il record di identità:
(...)
$auth = Zend_Auth::getInstance();
Zend_Session::regenerateId();
$storage = $auth->getStorage();
$rowobject = $authAdapter->getResultRowObject(null,'passwd');
$storage->write((array)$rowobject);
(...)
Buoni esempi. +1 – singles
+1 Mi piace l'idea di utente 'anonimo', e prometto che lo userei nei miei lavori :) – tawfekov
@singles grazie, questa è la soluzione che stavo cercando! –