Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-07-2009 16:37:11

aurao
Nouveau membre
Date d'inscription: 27-07-2009
Messages: 9

[résolu] Lister les utilisateurs en ligne

Bonjour,
Je souhaite réaliser un système d'authentification et de gestion de droits pour mes futurs projets. Mon but est d'utiliser au maximum le ZF, c'est pourquoi je pensais gérer l'authentification grâce à l'adaptateur Zend_Auth_Adapter_DbTable. Seulement cet adaptateur me semble un peu restreint, notamment si je veux joindre une table supplémentaire lors de l'authentification (pour récupérer des infos utilisateur) ou même lister tous les utilisateurs en ligne (voire pouvoir déconnecter un utilisateur).

Avant de passer au ZF (a vrai dire je n'ai encore rien codé avec le ZF, je suis encore en phase d'apprentissage et de farcissage de la doc xD), je stockais mes sessions dans une table sessions, qui me permettait de lister les utilisateurs connectés, etc... Donc je me demandais si je pouvais reproduire cette manière de gérer mes sessions ou si c'est une méthode à éviter ?

Merci d'avance smile

Dernière modification par aurao (29-07-2009 01:14:28)

Hors ligne

 

#2 27-07-2009 16:53:20

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

Re: [résolu] Lister les utilisateurs en ligne

j'ai déjà fais ça tu redéfini une classe dérivée de Zend_Auth_Adapter_DbTable et tu surcharge la méthode d'autentification
tu peux alors mettre ce que tu veux.

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.2 2008/08/25 07:57:27 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
{
    /**
     * __construct() - Sets configuration options
     *
     * @param  Zend_Db_Adapter_Abstract $zendDb
     * @param  string                   $tableName
     * @param  string                   $identityColumn
     * @param  string                   $credentialColumn
     * @param  string                   $credentialTreatment
     * @return void
     */
    public function __construct(Zend_Db_Adapter_Abstract $zendDb, $tableName = null, $identityColumn = null,
                                $credentialColumn = null, $credentialTreatment = null)
    {
        $parameters = Fast_Registry::getParameters();
        $parameters = $parameters->get('fast', (object)array('authTable' => 'user'));

        parent::__construct($zendDb, $parameters->authTable, 'usr_ident',
                                'usr_pwd', $credentialTreatment);
    }

    /**
     * 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)) {
            //Récupérer le nom du driver;
            $driver = basename(preg_replace('/_/', '/',get_class($this->_zendDb)));

            //methode d'acces à la date du jour en fonction du driver
            $today = array(
                'Oci' => 'sysdate',
                'Mysql' => 'NOW()'
            );
            $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(
                    '(CASE WHEN '.$this->_credentialColumn
                    . ' = '
                    . $this->_credentialTreatment, $this->_credential
                    )

                . ' THEN 1 ELSE 0 END) AS '
                . $this->_zendDb->quoteIdentifier('zend_auth_credential_match')
                );



            // get select
            $this->_dbSelect = $this->_zendDb->select();
            $this->_dbSelect->distinct()
                ->from($this->_tableName, array('*', $credentialExpression))
                ->join('PROFILE', $this->_zendDb->quoteIdentifier($this->_tableName).'.usr_id = '.$this->_zendDb->quoteIdentifier('PROFILE').'.usr_id', Array())
                ->where($this->_zendDb->quoteIdentifier($this->_tableName).'.'.$this->_identityColumn . ' = ?', $this->_identity)
                ->where($this->_zendDb->quoteIdentifier($this->_tableName).'.usr_begin_dt <= ' . $today[$driver])
                ->where($this->_zendDb->quoteIdentifier($this->_tableName).'.usr_end_dt >= ' . $today[$driver])
                ->where($this->_zendDb->quoteIdentifier('PROFILE').'.prf_begin_dt <= ' . $today[$driver])
                ->where($this->_zendDb->quoteIdentifier('PROFILE').'.prf_end_dt >= ' . $today[$driver])
            ;
        }
        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;
#Fast_Debug::show('$user', $this);
        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 = '?';
        }

        // query for the identity
        try {
            // get select
            $this->_getQuery();
            $resultIdentities = $this->_zendDb->fetchAll($this->_dbSelect->__toString());
         } catch (Zend_Db_Adapter_Exception $e) {
            $authResult['code'] = Zend_Auth_Result::FAILURE;
            $authResult['messages'][] = 'Conection fail.';
            return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['messages']);
        } 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'expression dans la requête est la car dans la version de ZF que j'utilisait il y avait incompatibilité avec Oracle

A+JYT

Hors ligne

 

#3 27-07-2009 17:02:59

aurao
Nouveau membre
Date d'inscription: 27-07-2009
Messages: 9

Re: [résolu] Lister les utilisateurs en ligne

Euh j'ai pas tout compris dans ce code :s

Mais la solution semble donc d'écrire ton propre Adapter. Seulement quel est l'intérêt d'étendre la classe Zend_Auth_Adapter_DbTable puisque tu as réécris le __construct et authenticate ?

EDIT: Bon j'ai parlé un peu vite, en me concentrant un peu j'ai compris ce que ça faisait xD Pour le construct tu as juste récupéré un nom de table dans le registre, mais pour le authenticate, tu as tout changé :s est-ce que tu t'es basé sur la classe existante, ou c'est toi qui a tout écrit ?? Parce que si la méthode getQuery() existe dans le Zend_Auth_Adapter_DbTable, il me suffirait de la modifier pour ajouter ma jointure. M'enfin pour utiliser une table sessions, il faudrait que je réécrive authenticate(), et ça me fait un peu peur en fait xD

Le fait de stoquer les sessions dans une table, c'est une mauvaise idée ? Y'a un autre moyen d'avoir le contrôle sur les sessions de tous les utilisateurs ?

Dernière modification par aurao (27-07-2009 17:11:58)

Hors ligne

 

#4 27-07-2009 22:14:11

aurao
Nouveau membre
Date d'inscription: 27-07-2009
Messages: 9

Re: [résolu] Lister les utilisateurs en ligne

Désolé pour le double post, mais j'ai maintenant une autre question :s

En fait, je ne sais tout simplement pas comment intégrer cette gestion des sessions à mon application :s J'aimerais en fait créer une sorte de "plugin", qui me génère un objet "User" à partir duquel je pourrais accéder aux infos de l'utilisateur, etc...
Seulement je ne sais pas du tout où écrire ce plug-in, comment l'appeler, etc ... :s J'ai cherché dans la doc mais j'ai vraiment du mal... Je ne sais pas si je dois créer une "resource" ou un "plug-in", et dans les 2 cas, je n'arrive pas à l'appeler dans mon bootstrap sad

Hors ligne

 

#5 28-07-2009 09:51:42

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

Re: [résolu] Lister les utilisateurs en ligne

aurao a écrit:

Euh j'ai pas tout compris dans ce code :s

Mais la solution semble donc d'écrire ton propre Adapter. Seulement quel est l'intérêt d'étendre la classe Zend_Auth_Adapter_DbTable puisque tu as réécris le __construct et authenticate ?

EDIT: Bon j'ai parlé un peu vite, en me concentrant un peu j'ai compris ce que ça faisait xD Pour le construct tu as juste récupéré un nom de table dans le registre, mais pour le authenticate, tu as tout changé :s est-ce que tu t'es basé sur la classe existante, ou c'est toi qui a tout écrit ?? Parce que si la méthode getQuery() existe dans le Zend_Auth_Adapter_DbTable, il me suffirait de la modifier pour ajouter ma jointure. M'enfin pour utiliser une table sessions, il faudrait que je réécrive authenticate(), et ça me fait un peu peur en fait xD

Le fait de stoquer les sessions dans une table, c'est une mauvaise idée ? Y'a un autre moyen d'avoir le contrôle sur les sessions de tous les utilisateurs ?

non dans la version que j'utilisais de zf il n'y a pas de getQuery
c'est moi qui l'ai ajouté pour justement séparer la query de la methode authenticate
cela permet par la suite de dériver la classe et de l'adapter plus facilement à un autre besoin

mais il faut regarder des version plus récente de la classe de base

pour cette classe me me suis simplement inspiré de ce qu'il y a dans ZF en essayant de rester au plus proche pour ne pas perturber le fonctionnement du framework et ne changer que ce dont j'avais besoin
A+JYT

Hors ligne

 

#6 28-07-2009 11:26:24

aurao
Nouveau membre
Date d'inscription: 27-07-2009
Messages: 9

Re: [résolu] Lister les utilisateurs en ligne

ok je pense que c'est ce que je vais faire aussi smile

merci beaucoup de ton aide.

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