Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 11-09-2009 14:48:01

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

[Résolu]Connexion à une application Zend peut être longue

Bonjour à tous,
je poste ce message car je recherche des conseils par rapport à mon travail. J'ai créer une application intranet destiné à du suivi d'articles en entrepot et j'ai utilisé Zend. Après pas mal de galère et quand même pas mal d'aide de ce forum très vivant, j'ai réussi à développer quelqu chose de positif et plaisant à mes supérieurs et destinataires de l'application. Il existe encore quelques tâches à développer mais je profite aussi d'un peu de calme dans mon travail pour essayé d'obtimiser mon application.

Là viens ma question, l'application n'est accessibles qu'après identification mais le temps entre le formulaire d'identification et la page d'accueil du site est un peu longue à mon goût. Lors de la validation des infos saisie je fais une recherche dans un premier dans ldap pour verifer s'il s'agit d'un utilisateur du réseau sinon je parcours ma table sql. une fois la personne identifier, j'utilise zend_cache pour stocker les droits (acl) de l'utilisateur.La deconnection elle aussi est un peu longue, toutes les autres pages se chargent rapidement, je pense donc que celà vient de mon controleur Auth.

Je vous joins mon code. Si quelques personnes avaient des remarques ou suggestions afin de réduire le temps liés à cette phase, elles sont les bienvenues.

Code:

<?php
//création du controleur
class AuthController extends Zend_Controller_Action
{
    //initialisation du controleur (initialisation de la vue et de la base url de la page)
    function init()    {
        $this->initView();
        $this->view->baseUrl = $this->_request->getBaseUrl();
    }
    //action appelé par défaut si aucune action n'est précisée)                
    function indexAction()    {
        //redirige vers l'index du site
        $this->_redirect('/');
    }
    
    //recupération des information ldap
    function ldap_identif($login,$passwd){ 
        //Connection à ldap
        $ad = ldap_connect("10.0.0.9 :389"); 
        //Définition des variables ldap
        ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
        //Bind sur le repertoire ldap avec le login et le mot de passe fourni
        if(@ldap_bind($ad,$login."@ccibco.com",$passwd)){
            //Accès au répertoire
            $filter='(&(sn=*)(givenname=*))';
            $result = ldap_search($ad, "OU=ccibco,DC=ccibco,DC=com", $filter);
            //on accède au données
            $entries = ldap_get_entries($ad, $result);    
            //on récupère les donnée de l'utilisateur
            $tab=array();
            for ($i=0; $i < $entries["count"]; $i++)
            {
                if(strtoupper($entries[$i]["samaccountname"][0])==strtoupper($login)){        
                    $tab['nom']=$entries[$i]["sn"][0];
                    $tab['prenom']=$entries[$i]["givenname"][0];
                    $tab['fonction']=$entries[$i]["department"][0];
                    $tab['tel']=$entries[$i]["telephonenumber"][0];
                    $tab['mail']=$entries[$i]["mail"][0];
                }
            }
            //Déconnection
            ldap_unbind($ad);
            //Renvoie des informations
            return $tab;        
        }else{//login ou mot de passe incorrect
            return false;
        }
    }
    
    //fonction d'identification
    function loginAction()    {
        if (Zend_Auth::getInstance()->hasIdentity()) {
            $this->_redirect('/');
        }
        //appel du registre de base de données
        $dbAdapter = Zend_Registry::get('dbAdapter');
        //initialisation du message à retourner en cas de problème
        $this->view->message = '';
        //si le formulaire de connection est envoyé
        if ($this->_request->isPost()) {
            // on récupère les informations transmises
            $f = new Zend_Filter_StripTags();
            $login = $f->filter($this->_request->getPost('ident'));
            //on récupère le mot de passe codé en md5
            $password = md5($f->filter($this->_request->getPost('pass')));
            //si le login est vide on retourne le formulaire avec un message d'erreur
            if (empty($login)) {
                $this->view->message = 'Saisissez votre identifiant.';
            } else /*sinon*/{
                //on controle si l'utilisateur est un utilisateur cci avec son compte entrprise
                $ldap=$this->ldap_identif($login,$this->_request->getPost('pass'));
                if(is_array($ldap))
                {
                    $users=new Utilisateurs();
                    $user=$users->fetchRow("login='".$login."' ");
                    if(count($user)>0){
                        //si il existe on met à jour ses données
                        $user->mot_passe=$password;
                        $user->qualification=$ldap['fonction'];
                        $user->telephone=$ldap['tel'];
                        $user->email=$ldap['mail'];
                        $user->modified=date('Y-m-d H:i:s');
                        $user->save();                        
                    }else{
                        //si l'utilisateur n'existe pas encore dans l'application on le créer
                        $user=$users->createRow();
                        $user->Profils_id = 0;
                        $user->type_utilisateur = 0;
                        $user->login = $login;
                        $user->mot_passe=$password;
                        if($ldap['nom']!=null)
                            $user->nom=$ldap['nom'];
                        else
                            $user->nom="N.C.";
                        if($ldap['prenom']!=null)
                            $user->prenom=$ldap['prenom'];
                        else
                            $user->prenom="N.C.";
                        $user->qualification=$ldap['fonction'];
                        $user->telephone=$ldap['tel'];
                        $user->email=$ldap['mail'];
                        $user->created = date('Y-m-d H:i:s');
                        $user->save();
                    }
                }
                // on initialise le Zend_Auth adapter avec notre base de données
                $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
                $authAdapter->setTableName('Utilisateurs');
                $authAdapter->setIdentityColumn('login');
                $authAdapter->setCredentialColumn('mot_passe');
                // on affecte les valeurs récupérées aux variables auth
                $authAdapter->setIdentity($login);
                $authAdapter->setCredential($password);
                //on realise l'authentification à partir des informations fournies
                $auth = Zend_Auth::getInstance();
                $result = $auth->authenticate($authAdapter);
                //si c'est ok
                if ($result->isValid()) {
                    //on récupère les informations de l'utilisateur
                    $data = $authAdapter->getResultRowObject(null, 'pass');
                    if($data->closed==null){
                        //on récupère le profil de l'utilisateur
                        $where=$dbAdapter->quoteInto('id = ?', $data->Profils_id);
                        $profils=new Profils();
                        $profil=$profils->fetchRow($where);
                        $data->Profils_designation=$profil->designation;
                        //en enregistre les informations en mémoire
                        $auth->getStorage()->write($data);
                        //initialisation du cache acl
                        $frontendOptions = array('lifetime' => 25200,'automatic_serialization' => true);
                        $backendOptions = array();
                        $cache = Zend_Cache::factory('Core','File',$frontendOptions,$backendOptions);
                        $cache->clean(Zend_Cache::CLEANING_MODE_OLD);
                        $acl=new MyAcl($profil->designation);
                        $cache->save($acl, 'myacl'.$data->id);
                        //on redirige vers l'index
                        $this->_redirect('/');
                    }else{
                        $this->view->message = utf8_encode('Compte fermé.');
                        //on retire toute les informations enregistrées pour l'auth zend
                        Zend_Auth::getInstance()->clearIdentity();
                    }
                } else {
                    //si c'est incorrect => retour au formulaire avec un message d'erreur
                    $this->view->message = 'Identification incorrecte.';
                }
            }
        }
        //initialisation du nom de la page envoyé au layout
        $this->view->title = "Identification";
        //envoie du rendu de la vue
        $this->render();
    }
    
    //fonction de deconnection
    function logoutAction()    {
        $identity=Zend_Auth::getInstance()->getIdentity();
        //on retire toute les informations enregistrées pour l'auth zend
        Zend_Auth::getInstance()->clearIdentity();
        //on supprime la session d'acl
        unset($_SESSION['myacl'.$identity->id]);
        //on redirige vers l'index
        $this->_redirect('/');
    }    
}
?>

Dernière modification par matdev (18-05-2010 16:18:25)

Hors ligne

 

#2 11-09-2009 16:06:06

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

Re: [Résolu]Connexion à une application Zend peut être longue

Tu as regardé le temps de réponse de ton annuaire LDAP ? (et tant qu'à faire, de ta base SQL aussi).

Sinon à vue de nez (j'ai lu le code très en diagonale), le seul truc qui pourrait ramer dans ton code, ça serait l'enregistrement des Acl. Ca dépend du volume de ce que tu rappatries et du temps de récupération de ces données.

Mais bon, le premier truc, regarde le temps de réponse de ton LDAP et de ta base SQL...

A+, Philippe


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

Hors ligne

 

#3 11-09-2009 16:15:28

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [Résolu]Connexion à une application Zend peut être longue

Le temps de réponse de ldap est bon, visiblement le problèmes tu l'as bien ciblé et je l'ai testé c'est l'enregistrement des acl. J'ai un grand nombre de ressources à passer est ça viendrai de là. Je sais pas trop comment optimiser cette partie aussi ... quelqu'un a une idée ?

Hors ligne

 

#4 11-09-2009 17:34:39

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

Re: [Résolu]Connexion à une application Zend peut être longue

Je ne sais pas ce que tu mets dans tes ACL, mais je trouve bizarre d'en avoir beaucoup à enregistrer en cache.

Si tu as des droits dynamiques en fonctions de données en bases, ça n'est pas forcément utile de les initialiser au login, tu peux aussi les tester "en direct" lors de l'accès à la ressource avec les assertions (Zend_Acl_Assert) :
http://framework.zend.com/manual/en/zen … anced.html

(ça dépend de ton application, mais ça me paraît possible que ton cache soit contre-productif...)

A+, Philippe


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

Hors ligne

 

#5 14-09-2009 08:39:41

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [Résolu]Connexion à une application Zend peut être longue

Je vais me repencher un peu sur le sujet, j'ai debuté avec Zend cette année par souhait de mon entreprise d'utiliser un framework mais pour un projet rapide et j'ai donc peut être passé rapidement sur certain élément me paressant suffisant pour commencer mais qui se trouve au final peut être juste vue l'ampleur du projet

Merci pour tes réponses philippe

Hors ligne

 

#6 18-05-2010 16:18:04

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [Résolu]Connexion à une application Zend peut être longue

Je reviens sur un ancien post afin d'informer que j'ai résolu mon problème en supprimant la partie ACL
Je fais un controle d'autorisation à l'aide d'un plugin sur chaque page entre le profil et la ressource

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