Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 14-02-2008 13:26:18

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

[résolu] Auth : requête sur plusieurs tables

rebonjour,

Voilà, je reviens sur l'utilisation de l'authentificator Auth :-) et voici comment il est utilisé jusqu'à présent :

Code:

$dbAdapter = Zend_Registry::get('dbAdapter');
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
                
//-- Défini la table User et indique les nom Username et Password que l'on vient de récupérer
$authAdapter->setTableName('users');
$authAdapter->setIdentityColumn('username');
$authAdapter->setCredentialColumn('password');
....
if ($result->isValid()) 
{
   // success: store database row to auth's storage
   // system. (on ne sauvegarde pas le mot de passe)
   $data = $authAdapter->getResultRowObject(null, 'password');
   $auth->getStorage()->write($data);
   $this->_redirect('/');
}

C'est bien et ça fonctionne. Mais je souhaiterai sauvegardé également des informations sur cet utilisateur qui se trouvent dans une autre table liée et si possible des infos de sessions sur cet utilisateur. Je profiterai donc d'avoir un objet $auth contenant toutes les infos nécessaires durant son passage sur mon futur site.

1. Existe-t'il un moyen de faire plusieurs setTableName('users_autres tables'); ?

2. Comment faire pour ajouter une variable à l'objet $auth ? Je ne fais pas qq chose contre nature si j'opère par $auth->valeur = xxx; par exemple ?

Merci (et encore désolé pour mes questions bêtes)

Dernière modification par whitespirit (16-02-2008 11:01:47)

Hors ligne

 

#2 15-02-2008 00:18:04

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [résolu] Auth : requête sur plusieurs tables

Ca n'est pas possible sans dériver la classe.
Il faut modifier le comportement de l'authentification. Mais cet objet auth n'est en théorie pas prévu pour contenir plein de valeurs, il vaut mieux un objet Zend_Db_Table_Row ( c'est faisable en quelques lignes dans une classe fille )

Hors ligne

 

#3 15-02-2008 06:14:04

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [résolu] Auth : requête sur plusieurs tables

Je n'ose pas trop faire de la dérivation pour le moment. Je ne me suis non plus pas penché sur le fonctionnement détaillé des bd, je vais me renseigner sur l'objet Table_Row.

Selon vous, qu'est-ce qui m'est préférable de faire : Dérivé l'objet Auth ou utiliser des sessions (ou utiliser Table_Row) ?

Merci

Hors ligne

 

#4 15-02-2008 09:35:21

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [résolu] Auth : requête sur plusieurs tables

Es ce que

Code:

$auth->getStorage()->write($MonObjet);

ne fonctionnerais pas? En admettant que $MonObjet soit un objet standard quelconque...
Je vais avoir le même problème d'ici peut mais je ne me suis pas encore penché dessus.

Hors ligne

 

#5 15-02-2008 09:35:29

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [résolu] Auth : requête sur plusieurs tables

Bonjour whitespirit,

Tu peux aussi créer ton propre adapteur sans passer par un adapteur par défaut. C'est finalement souvent plus simple que d'essayer d'utiliser les adapteurs de base et de les bidouiller dans tous les sens pour obtenir ce qu'on veut...
Tu peux trouver un exemple simple (voire simpliste) ici : http://www.kitpages.fr/zf_zendAuth.php

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#6 15-02-2008 11:37:06

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

Re: [résolu] Auth : requête sur plusieurs tables

tu peux aussi faire un post traitement
voici la classe model de mon contrôleur de login

Code:

<?php
class Login_Model
{
    /**
    *  @var Zend_Db_Adapter_Abstract
    */
    private $_db;
    private $;

    public function __construct()
    {

        $this->_db = Fast_Registry::get('dbAdapter');
    }

    // ==================== Db:Role ==========================

    /**
    * Retourne la collection des profils d'un utilisateur à partir
    * de son id (et non pas son ident, pas confondre).
    *
    * @param string $id index de l'utilisateur
    * @return array
    */
    public function getUserRolesByUserId($id)
    {
        // la requête suivante renvoie la liste des profils de l'utilisateur
        $select = $this->_db->select(); // @var $select Zend_Db_Select
        $select
        ->from('role', array('rol_id', 'rol_code', 'rol_label'))
        ->join('profile', 'profile.rol_id = role.rol_id', array('prf_date_begin', 'prf_date_end'))
        ->join('workgroup', 'workgroup.wkg_id = profile.wkg_id', array('wkg_id', 'wkg_code', 'wkg_label'))
        ->where('profile.usr_id = :_usr_id')
        ->where('rol_valid = 1')
        ->order('rol_left')
        ;
        #// dates non gérées dans cette version
        #->where('DATEDIFF(prf_date_begin, NOW()) <= 0')
        #->where("DATEDIFF(prf_date_end, NOW()) >= 0 OR prf_date_end='' OR prf_date_end IS NULL");
        $statement = $this->_db->prepare($select);
        $statement->setFetchMode(Zend_Db::FETCH_OBJ);
        $statement->execute(array('_usr_id' => $id));
        $list = $statement->fetchAll();
        return $list;
    }

    public function authenticate($login, $pass)
    {
        Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
        $dbAdapter = Zend_Registry::get('dbAdapter');
        $this->_authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
        $fetchMode = $dbAdapter->getFetchMode();
        $dbAdapter->setFetchMode(Zend_Db::FETCH_ASSOC);
        $this->_authAdapter->setTableName('user');
        $this->_authAdapter->setIdentityColumn('usr_ident');
        $this->_authAdapter->setCredentialColumn('usr_pwd');
        $this->_authAdapter->setIdentity($login);
        $this->_authAdapter->setCredential($pass);
        $auth = Zend_Auth::getInstance();
        $result = $auth->authenticate($this->_authAdapter);
        $dbAdapter->setFetchMode($fetchMode);
        return $result;
    }

    public function storeLoggedUser()
    {
        if ($this->_authAdapter) {
            $data = $this->_authAdapter->getResultRowObject(null, 'usr_pwd');
            $auth = Zend_Auth::getInstance();
            $auth->getStorage()->write($data);
        }
    }

    public function hasIdentity()
    {
        $auth = Zend_Auth::getInstance();
        return ($auth && $auth->hasIdentity());
    }

    public function getUserRoles()
    {
        $auth = Zend_Auth::getInstance();
        $user = $auth->getIdentity();
        return $this->getUserRolesByUserId($user->usr_id);
    }

    public function addRole($newRole)
    {
        $auth = Zend_Auth::getInstance();
        $data = $auth->getIdentity();
        $data->profile = $newRole;
        $auth->getStorage()->write($data);
    }

    public function clearIdentity()
    {
        Zend_Auth::getInstance()->clearIdentity();
    }

}

la première chose est de faire un authenticate() puis je garde les infos dans la session avec storeLoggedUser()
puis j'appelle getUserRoles() qui me retourne le ou les rôles de l'utilisateur
s'il n'en a pas je vire le user de la session avec clearIdentity()
s'il en a plusieurs je lui présente une liste pour qu'il choisisse sinon je pends celui qu'il à et j'ajoute le role à la session avec addRole()

j'ai des utilisateurs des rôles et des groupe de travail.
un rôle est un ensemble de droits sur des fonctionnalités par exemple forum moderator
un group est le domaine dans le quel mon utilisateur exerce sont role exp un forum
un profil est la relation entre les trois précédent.

je mais donc en session le nom prénom login (pas le pass) le code du role le nom du role le code du groupe, le nom du groupe.

A+JYT

Dernière modification par sekaijin (15-02-2008 11:37:41)

Hors ligne

 

#7 16-02-2008 11:01:01

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [résolu] Auth : requête sur plusieurs tables

Merci pour ta classe. J'en ai appris beaucoup !!!! J'aime bien ton approche (qui doit être l'approche de tous membres confirmés ici j'imagine), en quelque sorte si j'observe ta façon d'écrire ce type de classe, je remarque que tu peux utiliser les classes de ZF indépendamment du modèle MVC. Merci encore.

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