Ho basato la mia applicazione su Zend Framework. Sto usando Zend_Auth
per l'autenticazione, ma non sono sicuro che l'Zend_Acl
funzionerà per me perché, francamente, gli esempi che ho visto sono troppo semplicistici per i miei bisogni o mi confondono.Zend ACL soddisfa le mie esigenze?
Sto pensando a elementi nella mia applicazione come risorse e queste risorse possono avere privilegi. I ruoli che contengono i privilegi di risorsa sono definiti dinamicamente e assegnati agli utenti. Sto memorizzando queste informazioni in tabelle normalizzate.
- Gli utenti hanno un ruolo
- Un ruolo può avere più risorse
- risorse possono avere più privilegi
ruoli sono in realtà solo le collezioni di privilegi di risorse con nessuna gerarchia. Un esempio di una risorsa sarebbe "Pagina". Tutti possono visualizzare le pagine, ma un utente autenticato avrebbe bisogno dei privilegi "aggiungi", "modifica" o "cancella" per fare qualsiasi altra cosa con le pagine.
Questa mesh con Zend ACL? Sto pensando ACL in un modo che creerà problemi per me?
mia soluzione
Typeonerror ottiene il credito, ma ecco la mia soluzione specifica.
ho esteso Zend_Acl
per semplificare l'uso della mia perché io carico solo il ruolo dell'utente corrente:
class My_Acl extends Zend_Acl
{
protected $_role_id;
public function setRole($role_id)
{
$this->_role_id = $role_id;
return $this->addRole($role_id);
}
public function getRole()
{
return $this->_role_id;
}
public function deny($resource, $privilege)
{
return parent::deny($this->_role_id, $resource, $privilege);
}
public function allow($resource, $privilege)
{
return parent::allow($this->_role_id, $resource, $privilege);
}
public function isAllowed($resource, $privilege)
{
return parent::isAllowed($this->_role_id, $resource, $privilege);
}
}
per popolare il LCA eseguo una query che restituisce resource
, privilege
e role_id
colonne. La colonna role_id
è nullo nel set di risultati se il ruolo dell'utente non dispone di tale privilegio.
$acl = new My_Acl();
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$userInfo = $auth->getStorage()->read();
$acl->setRole($userInfo->role_id);
} else {
$acl->setRole('');
}
// QUERY HERE
foreach ($privileges as $privilege) {
if (!$acl->has($privilege['resource'])) {
$acl->addResource($privilege['resource']);
}
if (is_null($privilege['role_id'])) {
$acl->deny($privilege['resource'], $privilege['privilege']);
} else {
$acl->allow($privilege['resource'], $privilege['privilege']);
}
}
sto vedendo i livelli di utenti, ruoli e risorse nel tuo esempio. Ho utente, ruolo, risorsa, privilegio. Un utente ha un ruolo, un ruolo può avere più risorse e una risorsa può avere più privilegi. Sto fraintendendo qualcosa nella tua soluzione? – Sonny
Suoni di destra. Il modo in cui gli utenti sono impostati, ogni utente eredita i privilegi dal suo genitore.Quindi "admin" ottiene tutti i privilegi "guest" e "members". Sotto admin, consento "all" e quindi negare l'azione "purge" su tutte le risorse e negare l'azione "create" solo sul resume "cms: comments". In questo modo possono ancora accedere alle azioni "cms: comments-> view" o "cms: comments-> moderate". – typeoneerror
Aggiunto un po 'di codice. – typeoneerror