Zend_Acl con struttura modulare?
-
12-09-2019 - |
Domanda
Ho creato un MVC con Zend leggendo http: // quadro .zend.com / manuale / it / zend.controller.modular.html .
Il problema è che non riesco a trovare un modo per utilizzare Zend_Acl con struttura modulare. Zend_Acl non ha semplicemente un metodo per aggiungere moduli. Esso consente solo me aggiunga controller e azione.
Come si usa Zend_Acl con structrue modulare? E 'anche possibile con la versione corrente di Zend Framework?
Soluzione
E 'assolutamente è. Questo è quello che facciamo nel nostro progetto. Abbiamo autenticare URI percorsi ($request->getPathInfo()
), come: /admin/user/edit
. Qui "admin" è un modulo, "utente" è un controller, e "modifica" è un'azione. E abbiamo un plugin di accesso:
class Our_Application_Plugin_Access extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
foreach (self::current_roles() as $role) {
if (
Zend_Registry::get('bootstrap')->siteacl->isAllowed(
$role,
$request->getPathInfo()
)
) return;
}
$this->not_allowed($request);
}
...
}
Registrato in Application.ini:
resources.frontController.plugins.access = "Our_Application_Plugin_Access"
Altri suggerimenti
Altre possibilità di Ivan è quello di impostare le risorse invece che solo "controllore" a qc. come "modulo-Controller".
E 'possibile, lo uso ogni volta. Anzitutto ricordare che la risorsa che Zend_Acl verificherà è un'entità arbitraria (una stringa) , non necessario correlata a un particolare modulo o controllore. Può essere la stringa "ciao" e nel programma è possibile verificare se l'utente può accedere alla risorsa "ciao". Io uso spesso alcune risorse arbitrarie come "login-button", "pulsante logout" per mostrare il link nel Zend_Navigation.
Nel tuo caso, è necessario definire la risorsa (nella LCA) come alcuni stringa che può essere mappato a un layout del modulo / controller. Ad esempio per la barra dei moduli foo e il controller di definire la risorsa "foo.bar". Che nella procedura di controllo di accesso potrete leggere il modulo e il controller nome e unirli in una stringa per ottenere la risorsa.
In un esempio pratico:
class Application_Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {
...
public function preDispatch(Zend_Controller_Request_Abstract $request){
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
...
$resource = $module . '.' . $controller; //we create the custom resource according to the model we have defined
...
$role=NULL;
if($this->_auth->hasIdentity()){
$identity = $this->_auth->getStorage()->read(); //depending on your implementation
$role = $identity->role; //depending on your implementation
}
...
if(!$this->_acl->isAllowed($role, $resource, $action)){
//deny access
}
//allow access
}
}