Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Salut à tous une proposition qui simplifierait la vie du développeur lorsqu'on a besoin d'un adapter spécifique pour une l'authentification avec une base de donnée.
en gros Zend_Auth avec un base propose simplement
SELECT *, 'credentialColumn' = 'credential' AS zend_auth_credential_match FROM userTable WHERE 'identityColumn' = 'identity ';
Cela corresponds effectivement au besoin dans 99% des cas
Mais il arrive que le schémas ne soit pas celui-ci. il devient alors compliqué d'utiliser Zend_Auth.
un exemple simple ma table user contient un champs 'valid' qui dit si l'utilisateur est valide.
il est impossible d'ajouter un
AND 'valid' = true
Je dois donc après l'utilisation de Zend_Auth vérifier ce paramètre.
c'est exemple est le cas simple.
il peut arriver que la règle qui va donner l'accord sur l'authentification soit plus complexe. et là ça deviens plus que génant car il faut faire en php ce que la base sait très bien faire.
je propose donc d'ajouter une méthode dans Zend_Auth_Adapter_DbTable
protected function _getQuery() { $credentialExpression = new Zend_Db_Expr( $this->_zendDb->quoteInto( $this->_zendDb->quoteIdentifier($this->_credentialColumn) . ' = ' . $this->_credentialTreatment, $this->_credential ) . ' AS zend_auth_credential_match' ); // get select $dbSelect = $this->_zendDb->select(); $dbSelect->from($this->_tableName, array('*', $credentialExpression)) ->where($this->_zendDb->quoteIdentifier($this->_identityColumn) . ' = ?', $this->_identity); return $dbSelect; }
de remplacer les lignes 304 à 315
$credentialExpression = new Zend_Db_Expr( $this->_zendDb->quoteInto( $this->_zendDb->quoteIdentifier($this->_credentialColumn) . ' = ' . $this->_credentialTreatment, $this->_credential ) . ' AS zend_auth_credential_match' ); // get select $dbSelect = $this->_zendDb->select(); $dbSelect->from($this->_tableName, array('*', $credentialExpression)) ->where($this->_zendDb->quoteIdentifier($this->_identityColumn) . ' = ?', $this->_identity);
par :
$dbSelect = $this->_getQuery();
à partir de là il devient très simple de surcharger la classe Zend_Auth_Adapter_DbTable
il suffit de dériver cette classe Zend_Auth_Adapter_DbTable en My_Auth_Adapter_DbTable
de redéfinir la requête et d'utiliser la classe dérivée.
le même type de mécanisme peut être envisagé pour LDAP
de nombreuse société ont dans leur base ou leur annuaire des entrée qui sont réservée à des usage spécifiques et ces entrée ne corresponde pas un une authentification valide.
un simple exemple
l'annuaire contient la liste de tout le personnel de la boite. mais lorsque quelqu'un quitte la boite on ne le retire pas car son identifiant doit rester connu du SI pour la pérennité des informations. la personne est donc marqué comme n'étant plus membre du personnel.
avec Zend_Auth quelqu'un qui utiliserait le les login et password de cette personne serait authentifié Alors qu'il s'agit à coup sur d'une usurpation.
en adaptant Zend_Auth au mécanisme inter de la boite l'usurpation de ce type n'est plus possible.
dans ma boites les compte sont crée à l'avance et s'active entre deux date. Avec Zend_Auth tel qu'il est je dois bricoler avec un post traitement pour appliquer cette règle. un simple AND dans la requête faite ce travail.
A+JYT
Hors ligne
Hello,
Regardes http://framework.zend.com/manual/fr/zen … nced_usage
Tu peux faire :
$adapter = new Zend_Auth_Adapter_DbTable($db, 'utilisateurs', 'login', 'password', 'MD5(?) AND \'valid\'=true');
A+
Hors ligne
j'ai déjà regardé ça mais il est impossible avec ça d'aller plus loin que d'ajouter une clause sur un champs de la table user
ce que je propose c'est un mécanisme qui permet simplement de définir soit même la requête à effectuer sur la base
par exemple dans mon SI les personne reconnues doivent être inscrite dans le système avoir un dans de début de validité inférieure à la date du jour une date de fin de validité supérieure à la date du jour
avoir au moins un rôle définit dans l'entreprise pour une période couvrant la date du jour.
tel qu'il existe Z_A_A_DT me permets simplement de vérifier la première partie à savoir les dates de validité de la personne
pour le reste il faut refaire une requête.
après Z_A_A_DT et changer le true en false si les conditionne sont pas remplies.
A+JYT
Hors ligne
Hello,
En quelle version es-tu ?
Ceci existe depuis la version 1.5.0. Z_A_A_DT a été fractionné et ce que tu proposes correspond à la fonction "_authenticateCreateSelect()"
A+
Hors ligne
OK je suis en 1.0.3 car PHP incompatible avec la 1.5
Ok alors on peu clore le débat
A+
JYT
Hors ligne
Hello,
Normalement la version 1.0.4 comporte aussi ce changement.
A+
Hors ligne
Pages: 1