Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonsoir à tous,
Par facilité au bout du compte, j'aurais aimé faire une authentification sur 2 tables (enfin comme si je faisais une jointure en fait). Cela m'éviterait plus tard de faire une query pour récupérer des éléments.
Donc le truc c'est que j'aurais aimé faire une authenficiation comme si la query finale possédait un LEFT JOIN...
Est-ce possible ? Comment ?
Merci !
Hors ligne
oui il te faut construire ton propre adapter
le plus simple est de reprendre l'adapter Db de Zend et de remplacer la requête par défaut par la tienne
ensuite tu utilise ton adapter en lieu et place de celui de Zend
le tout est de respecter les prototypes des méthodes et surtout les champs remonté par la requête de Zend sans ces valeur le zend auth ne fonctionne pas.
pour ma part j'ai des utilisateurs qui ont une période d'activité qui ont un rôle dans l'application pendant une période donnée. un utilisateur est autorisé si la date courante est dans sa période d'activité et qu'il à un role dont la période contient la date du jour
A+jyt
Hors ligne
l'adapter Fast_Auth_Adapter_DbTable
<?php /** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @package Fast * @subpackage Fast_Auth * @subpackage Fast_Auth_Adapter * @copyright ftgroup * @author Jean-Yves Terrien * @version $Id: DbTable.php,v 1.1 2008/07/01 13:21:04 sekaijin Exp $ */ /** * @see Zend_Auth_Adapter_DbTable */ Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable'); /** * @package Fast * @subpackage Fast_Auth * @subpackage Fast_Auth_Adapter * @copyright ftgroup */ class Fast_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable { /** * Requete sur la base. * * @var Zend_Db_Adapter_Abstract */ protected $_dbSelect = null; public function setQuery($query) { $this->_dbSelect = $query; } protected function _getQuery() { if (!isset($this->_dbSelect)) { $exception = null; if ($this->_tableName == '') { $exception = 'A table must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; } elseif ($this->_identityColumn == '') { $exception = 'An identity column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; } elseif ($this->_credentialColumn == '') { $exception = 'A credential column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; } elseif ($this->_identity == '') { $exception = 'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'; } elseif ($this->_credential === null) { $exception = 'A credential value was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'; } if (null !== $exception) { /** * @see Zend_Auth_Adapter_Exception */ require_once 'Zend/Auth/Adapter/Exception.php'; throw new Zend_Auth_Adapter_Exception($exception); } $credentialExpression = new Zend_Db_Expr( $this->_zendDb->quoteInto( $this->_zendDb->quoteIdentifier($this->_credentialColumn) . ' = ' . $this->_credentialTreatment, $this->_credential ) . ' AS zend_auth_credential_match' ); // get select $this->_dbSelect = $this->_zendDb->select(); $this->_dbSelect->distinct() ->from($this->_tableName, array('*', $credentialExpression)) ->join('profile', 'user.usr_id = profile.usr_id', Array()) ->where($this->_zendDb->quoteIdentifier($this->_identityColumn) . ' = ?', $this->_identity) ->where('user.usr_begin_dt <= NOW()') ->where('user.usr_end_dt >= NOW()') ->where('profile.prf_begin_dt <= NOW()') ->where('profile.prf_end_dt >= NOW()') ; } #Fast_Debug::show('$select', "$this->_dbSelect"); return $this->_dbSelect; } /** * authenticate() - defined by Zend_Auth_Adapter_Interface. * * @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible * @return Zend_Auth_Result */ public function authenticate() { $exception = null; if ($this->_identity == '') { $exception = 'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'; } if (null !== $exception) { /** * @see Zend_Auth_Adapter_Exception */ require_once 'Zend/Auth/Adapter/Exception.php'; throw new Zend_Auth_Adapter_Exception($exception); } // create result array $authResult = array( 'code' => Zend_Auth_Result::FAILURE, 'identity' => $this->_identity, 'messages' => array() ); // build credential expression if (empty($this->_credentialTreatment) || (strpos($this->_credentialTreatment, "?") === false)) { $this->_credentialTreatment = '?'; } // get select $this->_getQuery(); // query for the identity try { $resultIdentities = $this->_zendDb->fetchAll($this->_dbSelect->__toString()); } catch (Exception $e) { /** * @see Zend_Auth_Adapter_Exception */ require_once 'Zend/Auth/Adapter/Exception.php'; throw new Zend_Auth_Adapter_Exception('The supplied parameters to Zend_Auth_Adapter_DbTable failed to ' . 'produce a valid sql statement, please check table and column names ' . 'for validity.'); } if (count($resultIdentities) < 1) { $authResult['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; $authResult['messages'][] = 'A record with the supplied identity could not be found.'; return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']); } elseif (count($resultIdentities) > 1) { $authResult['code'] = Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS; $authResult['messages'][] = 'More than one record matches the supplied identity.'; return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']); } $resultIdentity = $resultIdentities[0]; if ($resultIdentity['zend_auth_credential_match'] != '1') { $authResult['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; $authResult['messages'][] = 'Supplied credential is invalid.'; return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']); } unset($resultIdentity['zend_auth_credential_match']); $this->_resultRow = $resultIdentity; $authResult['code'] = Zend_Auth_Result::SUCCESS; $authResult['messages'][] = 'Authentication successful.'; return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']); } }
l'utilisation
Zend_Loader::loadClass('Fast_Auth_Adapter_DbTable'); $this->_authAdapter = new Fast_Auth_Adapter_DbTable($dbAdapter); $this->_authAdapter->setIdentity($login); $this->_authAdapter->setCredential($pass); $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($this->_authAdapter);
A+JYT
Hors ligne
Bonjour,
Merci pour votre code, ça m'a super dépanné !
(Dans ma table, je devais tester si le compte utilisateur était actif ou non)
Par contre j'ai quelques questions :
1)J'ai placé le code dans le répertoire "/library", mais je me demande si je n'aurais pas du le mettre dans le répertoire "/models" ?
2)Pourquoi avoir choisi le nom "Fast_Zend_Auth_Adapter_DbTable" qui oblige a créer une arborescence ?
3)Je n'ai pas encore analysé tout votre code, mais n'était-il pas possible de surcharger seulement la fonction "_authenticateCreateSelect()" ?
On pourrait alors aussi ajouter une fonction "addWhere" qui serait pris en compte dans la construction de la requête.
Cdt,
Eric.
Hors ligne
Hello,
1) je l'aurais aussi mis dans library
2) C'est "Fast_Auth_Adapter_DbTable" sans le Zend, quand tu connais bien la structure du ZF, c'est bien que les extensions de classe ZF respecte la même structure, je trouve pour ma part que c'est plus simple de s'y retrouver
3) si je me souviens bien, sekaijin est en ZF 1.0.4 et "_authenticateCreateSelect()" est apparu en 1.5.0
A+
Hors ligne
Merci pour ta réponse.
1) En fait, le code de sekaijin utilise explicitement sa table 'users' et ses champs 'dates_xxx'; pour le mien, j'ai mis le nom de mon champ 'actif', donc j'en déduis que j'aurais du le mettre dans "/models".
3) C'est bien ce que je pensais, mais je n'avais pas tout l'historique des évolutions.
Je vais donc changer en ajoutant une fonction addWhere et laisser dans "/library"
2) Je me demandais si la racine "Fast" voulait dire quelque chose. J'ai choisi "Alt" pour mon script.
Hors ligne
Pages: 1