2 votes

Versioning de l'identité de Zend_Auth

Il y a une situation : Je stocke des données structurées (par exemple un tableau ou un objet, ou même une chaîne) comme une identité Zend_Auth. D'une version à l'autre, la structure de l'identité peut être modifiée. Ainsi, l'identité d'une version peut (ou ne peut pas) être compatible avec le code d'application d'une autre version.

J'aimerais avoir la possibilité de valider si les données d'identité stockées sont conformes aux exigences de la version actuelle.

D'après le manuel, la vérification de l'existence de l'identité s'effectue de la manière suivante :

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists; get it
    $identity = $auth->getIdentity();
}

Mais il n'y a aucune possibilité de se connecter à hasIdentity() ou à un autre endroit pour effectuer la validation.

La seule façon que je vois de le faire est d'implémenter mon propre Zend_Auth_Storage_Interface qui utilisera un autre stockage comme implémentation et effectuera la validation des données stockées.

Existe-t-il une solution plus appropriée ?

2voto

Boris Guéry Points 23606

Je ne suis pas totalement sûr de comprendre mais il semble que vous ayez mal compris la différence entre l'autorisation et l'authentification.

Zend_Auth concerne l'authentification, donc vous devriez no utiliser Zend_Auth pour traiter l'autorisation mais Zend_Acl.

Cependant, si ce que vous voulez c'est magasin une information supplémentaire à partir du processus d'authentification (c'est-à-dire l'authentification de la base de données), vous pouvez utiliser la fonction getResultRowObject($returnColumns, $ommitColumns); méthode.

Il existe plusieurs façons d'obtenir le "Row Object" en fonction de votre adaptateur actuel.

Zend_Auth_Storage_Interface concerne le stockage du résultat, je ne pense pas que vous aurez besoin de faire une telle implémentation puisqu'il s'agit de stocker l'objet d'identité en session ou dans une base de données par exemple.

Ce que vous pouvez vouloir, c'est utiliser Zend_Acl et construire une liste de contrôle d'accès qui définit de manière générique une liste de contrôle d'accès. Rôle ( peut être un utilisateur ), a Ressources ( votre application version-ed ), a Privilège ( peut utiliser ou non )


Note : *La plupart des gens ont des difficultés à utiliser Zend_Acl car ils pensent en Module/Contrôleur/Action, mais c'est juste une façon de définir une ressource.
Une ressource peut être ce que vous voulez, une application entière, une action du contrôleur, une vue, un autre utilisateur, une connexion à une base de données, etc.

0voto

Tomáš Fejfar Points 6396

Même si vous avez accepté la réponse ci-dessus, je crois que vous avez besoin d'autre chose.

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists - validate if it's valid

    $identity = $auth->getIdentity();
    if (!HelperClass::validateIdentity($identity)) { //you validation method
         /* User has stored identity from previous version. 
          * It may miss some important info (like a role value
          * you added recently). Clear it and require re-login. */
         $auth->clearIdentity();
         $this->_helper->flashMessenger('Please login ...');
         $this->_helper->redirector('login');
    }
    // identity is valid
    $acl = Acl::factory(); //get acl object somehow
    if (!$acl->isAllowed($module.$controller.$action, $identity->role)) {
         throw new AccessDeniedException();
    }
    // else nothing -> user has valid session data and is allowed to access the resource. 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X