Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-07-2008 21:10:24

Akis
Membre
Date d'inscription: 29-03-2008
Messages: 86
Site web

[Zend_Auth] Authentification sur 2 tables ?

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

 

#2 07-07-2008 22:20:15

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_Auth] Authentification sur 2 tables ?

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

 

#3 07-07-2008 23:26:05

Akis
Membre
Date d'inscription: 29-03-2008
Messages: 86
Site web

Re: [Zend_Auth] Authentification sur 2 tables ?

Ok merci, je regarderai demain.

Hors ligne

 

#4 08-07-2008 12:48:34

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_Auth] Authentification sur 2 tables ?

l'adapter Fast_Auth_Adapter_DbTable

Code:

<?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

Code:

        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

 

#5 08-07-2008 17:06:35

Akis
Membre
Date d'inscription: 29-03-2008
Messages: 86
Site web

Re: [Zend_Auth] Authentification sur 2 tables ?

Merci, ça m'a beaucoup aidé !

Hors ligne

 

#6 12-01-2009 17:27:28

epasquier
Membre
Date d'inscription: 12-01-2009
Messages: 15

Re: [Zend_Auth] Authentification sur 2 tables ?

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

 

#7 12-01-2009 17:55:28

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Zend_Auth] Authentification sur 2 tables ?

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+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#8 12-01-2009 21:23:46

epasquier
Membre
Date d'inscription: 12-01-2009
Messages: 15

Re: [Zend_Auth] Authentification sur 2 tables ?

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages