Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Acl & Zend_Auth
Zend_Acl & Zend_Auth Forum d'entraide pour les composants Zend_Acl & Zend_Auth du Zend Framework (contrôle d'accès, gestion des droits, authentification, etc.). Avant de poster -> Cours Zend_Acl et Zend_Auth.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/03/2011, 09h48   #1
Invité de passage
 
Inscription : mars 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 6
Points : 3
Points : 3
Par défaut Authentification sur deux colonnes

Bonjour,

J'me posais le question de savoir comment faire pour gérer une identification sur deux colonnes.
Je m'explique, mon ACL, mon Auth, tout fonctionne bien.
Voici le code de mon adaptateur
Code :
1
2
3
4
5
6
7
8
9
 
protected function _getAuthAdapter() {
				$dbAdapter = Zend_Db_Table::getDefaultAdapter();
				$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
				$authAdapter->setTableName('client')
						  ->setIdentityColumn('nom')
						  ->setCredentialColumn('mdp');
				return $authAdapter;
		    }
Donc, mon identification vérifie mon identity pour la colonne nom., je souhaiterai qu'il vérifie en même temps la colonne email.

C'est possible de le faire avec deux adaptateurs, mais, ça fait faire 2 requêtes pour rien, j'ai essayé des trucs du genre nom OR mail, (nom OR mail) ... mais bon, c'était plus des tentatives désespérées.
On doit pouvoir aussi, en modifiant la classe Zend_Auth_Adapter_DbTable, mais, ça m’embêterait vraiment d'y toucher.

Quelles pourraient être les solutions ?
Eixurit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 10h19   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 174
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 174
Points : 6 460
Points : 6 460
Ceci ne fonctionne pas ?

Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
protected function _getAuthAdapter() {
				$dbAdapter = Zend_Db_Table::getDefaultAdapter();
				$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
				$authAdapter->setTableName('client')
						  ->setIdentityColumn('nom')
                                                  ->setIdentityColumn('email')
						  ->setCredentialColumn('mdp');
				return $authAdapter;
		    }
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 10h27   #3
Invité de passage
 
Inscription : mars 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 6
Points : 3
Points : 3
Merci de la réponse

Mais cela ne fonctionne pas, seule la colonne mail est vérifiée, et non la colone nom ...
Eixurit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 17h54   #4
Invité de passage
 
Inscription : mars 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 6
Points : 3
Points : 3
Et, bien pour ceux et celles qui se posent la question, voici comment j'ai résolu mon affaire.
L'idée étant qu'un utilisateur pouvait se logguer soit avec son mail+mdp, soit avec pseudo+mdp.

La solution était l'extension de la classe Zend_Auth_Adapter_DbTable.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
<?php
 
class Auth_AuthAdaptDeuxColonnes extends Zend_Auth_Adapter_DbTable{
    protected $_identityColumn2 = null;
 
	public function addIdentityColumn($identityColumn)
    {
        $this->_identityColumn2 = $identityColumn;
        return $this;
    }
 
	protected function _authenticateCreateSelect()
    {
        // build credential expression
        if (empty($this->_credentialTreatment) || (strpos($this->_credentialTreatment, '?') === false)) {
            $this->_credentialTreatment = '?';
        }
 
        $credentialExpression = new Zend_Db_Expr(
            '(CASE WHEN ' .
            $this->_zendDb->quoteInto(
                $this->_zendDb->quoteIdentifier($this->_credentialColumn, true)
                . ' = ' . $this->_credentialTreatment, $this->_credential
                )
            . ' THEN 1 ELSE 0 END) AS '
            . $this->_zendDb->quoteIdentifier(
                $this->_zendDb->foldCase('zend_auth_credential_match')
                )
            );
 
        // get select
        $dbSelect = clone $this->getDbSelect();
        $dbSelect->from($this->_tableName, array('*', $credentialExpression))
                 ->where($this->_zendDb->quoteIdentifier($this->_identityColumn, true) . ' = ?', $this->_identity)
				 ->orWhere($this->_zendDb->quoteIdentifier($this->_identityColumn2, true) . ' = ?', $this->_identity);
        return $dbSelect;
    }
}
et dans mon controlleur :

Code :
1
2
3
4
5
6
7
8
9
10
 
protected function _getAuthAdapter() {
				$dbAdapter = Zend_Db_Table::getDefaultAdapter();
				$authAdapter = new Auth_AuthAdaptDeuxColonnes($dbAdapter);
				$authAdapter->setTableName('client')
							->setIdentityColumn('nom')
							->addIdentityColumn('mail')
							->setCredentialColumn('mdp');
				return $authAdapter;
		    }
Eixurit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h51.


 
 
 
 
Partenaires

Hébergement Web