IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Acl & Zend_Auth PHP Discussion :

Zend_auth - Avoir deux authentification sur deux appli Zend


Sujet :

Zend_Acl & Zend_Auth PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut Zend_auth - Avoir deux authentification sur deux appli Zend
    bonjour à tous,

    J'essaie de mettre en place quelques choses de pas très commun et j'ai besoin de votre aide.

    Je suis en train de développer un ensemble de petites applications sur lesquelles une authentification sera nécessaire. Je voudrais donc centraliser ces authentifications pour les informations communes (nom prénom etc) et avoir une authentification pour le reste des informations particulières à chaque application.

    Pour être plus concret, je vais prendre l'exemple de google.
    On créer s'authentifie d'abord sur notre compte google et ensuite on s'authentifie sur analytics par exemple.

    Je voudrais reproduire ce cheminement avec zend mais je en sais pas trop comment m'y prendre.

    Prenons 2 application => Appli1 et Appli2 et une appli d'authentification AppliCenter.
    Voici les URLs correspondantes:
    http://monsite.com/Appli1 ou http://Appli1.monsite.com/
    http://monsite.com/Appli2 ou http://Appli2.monsite.com/
    http://monsite.com/AppliCenter ou http://AppliCenter.monsite.com/

    J'ai donc déjà la première partie en créant l'authentification sur AppliCenter. Je suis donc bien authentifier mais lorsque je vais sur Appli1, je peux encore récupérer l'instance d'authentification que j'avais créée sur AppliCenter. Zend_Auth::getInstance()->getIdentity(); me donne bien l'identité que j'avais sur AppliCenter.

    Comment cela est possible alors que c'est bien deux applications différentes avec deux bibliothèques distinctes ?

    Avez vous déjà eu ce genre d'archi et dans ce cas, comment faire la suite de mon authentification ?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Les applications ont beau être différentes, si tu es sur le même serveur, les identifiants de session sont partagés entre tes différentes applis. D'où la récupération de l'identification d'une appli sur l'autre (en passant par les sessions).

    Quand tu dis que tu veux une authentification commune (déjà ok si j'ai bien compris) et une authentification spécifique, ça signifie que les utilisateurs doivent se logguer deux fois ? Ou juste que tu veux récupèrer des données spécifiques d'une application (sans nouvelle authentification de l'utilisateur) ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    L'utilisateur devra se connecter 2 fois.
    Dans le principe, l'utilisateur s'inscrit sur appliCenter. Pour cette inscription, il doit renseigner des infos générales (prénom nom nationalité etc). Le but est d'avoir l'ensemble des utilisateurs inscrit sur ce site.
    Ensuite, il y a plusieurs application qui tourne autour. Pour que l'utilisateur utilise ces applications, il doit faire une seconde inscription dans laquelle il ne rentre que quelques informations supplémentaire et ne servant que pour cette appli.
    Une fois inscrit, il doit donc s'authentifier sur appliCenter et ensuite sur appli1.

    Le but est d'avoir un ensemble d'application que les utilisateurs peuvent utiliser en aillant toujours la même identité. (ex : compte google qui permet d'avoir accès ensuite à tous les autres services. Analytics, adsense etc)

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Pour l'inscription, ok, mais pour l'authentification, je ne te suis pas...

    Tu veux gérer deux mots de passe ? (un pour appliCenter et l'autre pour appli1)

    Si ce n'est pas le cas, alors l'utilisateur ne s'authentifie qu'une fois (dans appliCenter), et dans appli1, tu te sert de cette authentification pour vérifier s'il a des infos supplémentaires spécifiques de l'appli (mais sans le ré-authentifier).

    Tu peux stocker les infos spécifiques dans des variables elles-mêmes stockées par Zend_Auth, en utilisant l'interface Zend_Auth_Storage_Interface.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    Oki. Je ne savais pas que les sessions d'authentification étaient partagée entre différentes applis d'un même serveur et en fait, ça m'arrange beaucoup.
    Je ne connais pas le fonctionnement de Zend_Auth_Storage_Interface. Je lis la doc mais j'avoue que j'ai un peu de mal. Aurais-tu un exemple ou un lien vers un tuto à me conseiller ?

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Pour le partage des sessions, je ne connais pas très bien le paramétrage des serveurs web, mais tu dois avoir la possibilité de les séparer. Mais par défaut, si tes applis ne sont que des répertoires dans ton serveur, les identifiants de session sont bien partagés.

    Pour Zend_Auth_Storage_Interface, c'est simplement une interface (!) qui permet d'interagir avec la classe de stockage utilisé par Zend_Auth. Pour récupérer les données stockées, il faut faire Zend_Auth::getInstance()->getStorage()->read(); et pour écrire des données, il faut faire Zend_Auth::getInstance()->getStorage()->write();
    Tu peux ainsi créer ta propre classe de stockage (utilisant les sessions, une base de données, ce que tu veux) :
    http://framework.zend.com/manual/fr/...istence.custom

    Ce que je te proposais, c'était dans ton appli générale d'identification, faire après authentification de l'utilisateur quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $data = array('AppliCenter' => array('login' => $login, 'nom' => $nom, ...));
    $auth->getStorage()->write($data);
    Puis dans les autres applis, si l'utilisateur est déjà authentifié (sinon le rediriger vers AppliCenter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $data = $auth->getStorage()->read();
    if (isset($data['Appli1']))
    {
        // l'utilisateur est déjà venu sur appli1 et a déjà récupéré ses infos persos
    }
    else
    {
        // récupération des infos de l'utilisateur grâce aux données de $data['AppliCenter'], par exemple le login
        // si l'utilisateur est inconnu, redirection vers une page d'enregistrement
        // sinon, ajout des infos particulières à Appli1 :
        $data['Appli1'] = array('propriete1' => $prop1, 'propriete2' => $prop2);
        $auth->getStorage()->write($data);
    }
    Je n'ai pas testé ce mode de fonctionnement, mais ça devrait répondre à ton besoin

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    J'ai essayé de faire quelque chose de similaire hier mais je n'ai pas eu de résultat concluant.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $data = $authAdapter->getResultRowObject(null, 'member_password');
     
    echo print_r($data);
    $auth->getStorage()->write($data);
    echo print_r($auth->getStorage()->read());
     
    echo print_r(array('member_add_data' => 'maVariable'));
    $auth->getStorage()->write(array('member_add_data' => 'maVariable'));
    echo print_r($auth->getStorage()->read());
    et voici ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    stdClass Object
    (
        [member_id] => 2
        [member_email] => membre2@mail.com
        [member_name_full] => membre 2
        [member_name_first] => membre
        [member_name_last] => 2
    )
    1stdClass Object
    (
        [member_id] => 2
        [member_email] => membre2@mail.com
        [member_name_full] => membre 2
        [member_name_first] => membre
        [member_name_last] => 2
    )
    1Array
    (
        [member_add_data] => maVariable
    )
    1Array
    (
        [member_add_data] => maVariable
    )
    1
    On voit donc au départ que j'arrive à stocker le résultat de mon authentification. J'essaie ensuite de rajouter des données en plus "membre_add_data" mais lorsque je stock cette variable et que j'affiche de nouveau le getStorage, on voit que j'ai perdu les valeurs précédentes.

    Comment faire pour ajouter du contenu sans supprimer le précédent?

  8. #8
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    En mettant les différentes données dans des clés différentes d'un tableau associatif comme je te l'avais proposé. Une autre solution, c'est d'utiliser d'autres namespaces de session pour stocker tes différentes données (mais dans ce cas on quitte Zend_Auth pour aller vers Zend_Session) : tu stocke les données d'applicenter avec Zend_Auth (comme tu as fait dans l'exemple), et pour les autres applis, tu stocke les données particulières dans des sessions avec un namespace qui reprend le nom de l'appli...

    Ton exemple modifié (mais non testé) - en utilisant uniquement Zend_Auth :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $data = array('AppliCenter' => $authAdapter->getResultRowObject(null, 'member_password'));
     
    print_r($data);
    $auth->getStorage()->write($data);
    print_r($auth->getStorage()->read());
     
    $data2 = $auth->getStorage()->read();
    // normalement avant de faire ça tu as vérifié que $data2['Applicenter'] existait bien
    $data2['Appli1'] = array('member_add_data' => 'maVariable');
    print_r($data2);
    $auth->getStorage()->write($data2);
    print_r($auth->getStorage()->read());

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    oki.

    Ce que je ne comprends pas, c'est qu'à chaque fois que je veux rajouter une variable (dans appli1 ou applicenter) au tableau existant, cela efface le contenu du tableau pour le remplacer par ma variable.

    Voila le tableau final de ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Array
    (
        [AppliCenter] => stdClass Object
            (
                [member_id] => 3
                [member_email] => membre3@mail.com
                [member_name_full] => membre 3
                [member_name_first] => membre
                [member_name_last] => 3
                [member_name_second] => 
            )
     
        [Appli1] => Array
            (
                [member_add_data] => maVariable
            )
     
    )
    Si je rajoute ce code pour rajouter une variable dans appli1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $data3 = $auth->getStorage()->read();
    $data3['Appli1'] = array('member_add_data_2' => 'maVariable2');
    $auth->getStorage()->write($data3);
    print_r($auth->getStorage()->read());
    voilà le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Array
    (
        [AppliCenter] => stdClass Object
            (
                [member_id] => 3
                [member_email] => membre3@mail.com
                [member_name_full] => membre 3
                [member_name_first] => membre
                [member_name_last] => 3
                [member_name_second] => 
            )
     
        [Appli1] => Array
            (
                [member_add_data_2] => maVariable2
            )
     
    )
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Array
    (
        |
        |
     
        [Appli1] => Array
            (
                [member_add_data] => maVariable             
                [member_add_data_2] => maVariable2
            )
     
    )

  10. #10
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Il faut que tu changes la clé du tableau associatif !

    J'avais pris comme exemple Appli1 pour ta première application, mais pour chaque appli, il faut que tu utilises son nom, ce qui doit donner à la fin un tableau comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Array
    (
        [AppliCenter] => stdClass Object
            (
                [member_id] => 3
                [member_email] => membre3@mail.com
                [member_name_full] => membre 3
                [member_name_first] => membre
                [member_name_last] => 3
                [member_name_second] => 
            )
     
        [Appli1] => Array
            (
                [member_add_data] => maVariable
            )
     
        [Appli2] => Array
            (
                [member_add_data2] => maVariable2
            )
     
        ...
     
        [AppliDeNomxx] => Array
            (
                [member_add_datan] => maVariablen
            )
    )

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    Oui, mais c'est bien une variable pour Appli1 que je veux donc rajouter dans le tableau appli1.
    Est-il possible d'avoir un enregistrement qui se rajoute à la suite de " [member_add_data] => maVariable" pour avoir ce tableau ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [Appli1] => Array
        (
                [member_add_data] => maVariable             
                [member_add_data_2] => maVariable2
        )
    Dans tout les cas, merci pour ton aide

  12. #12
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Ah d'accord, dans ce cas là il faut que tu fasses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data['Appli1']['member_add_data_2']  = 'maVariable2';
    Mais pour faire cela il faut être sûr que $data['Appli1'] soit bien un tableau (donc qu'il ait déjà été créé).

    Mais tout ça n'a pas grand chose à voir avec le framework, c'est de l'utilisation de tableaux associatifs :
    http://g-rossolini.developpez.com/tu...syntaxe#LIII-J

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    A oui c'est vrai. Au temps pour moi. Le passage par la write m'a embrouillé dans le fonctionnement normal du tableau.
    Je ne pourrais tenter cela que ce soir mais je pense que ça va marcher. (et ça n'a en effet rien à voir avec le ZF. Toutes mes excuses).

    Sinon, pour en revenir sur le fonctionnement du ZF et l'enregistrement durable d'information concernant l'utilisateur, est-il possible (et bien) d'enregistrer tout ce que je veux de la même façon ou y a t-il des cas particuliers ou je devrais utiliser Zend_session.
    Pour moi, j'ai l'impression que le résultat est exactement le même. Pourtant, je ne crois pas que ce soit l'habitude du ZF que de proposer plusieurs fonctionnalité de base pour faire la même chose...

  14. #14
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Selon moi, l'intérêt d'utiliser Zend_Auth, c'est que tes données sont bien liées à l'utilisateur et à son authentification. Donc je pense qu'il est préférable de tout stocker via cette classe. Ca évite notamment d'oublier de supprimer d'autres informations lors de la déconnexion de l'utilisateur.

    Zend_Session devrait plutôt dans ton cas être utilisé si tu as besoin de stocker des informations sans lien avec l'authentification, qui pourront perdurer après déconnexion par exemple...

  15. #15
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    Oki, cela me parait logique également.

    J'ai pu avancer un peu dans mes tests (difficile pour moi de travailler deux jours de suite sur mon développement en ce moment...).

    Voici donc ce que j'arrive à obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    array
    (
        [appliCenter] => stdClass Object
            (
                [member_id] => 1
                [member_email] => membre1@mail.com
                [member_name_full] => membre 1
                [member_name_first] => membre
                [member_name_last] => 1
            )
     
        [appli1] => Array
            (
                [member_add_data] => maVariable
                [member_add_data_2] => maVariable2
            )
     
    )
    On peut remarquer que ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $authAdapter->getResultRowObject(null, 'member_password')
    ... renvoie un stdClass et que les variables que je rajoute ensuite sont sous forme de tableau.
    Donc si je veux afficher des informations, je dois le faire de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo $this->user['appliCenter']->member_name_full;
    echo $this->user['appli1']['member_add_data'];
    Je voulais savoir quelle était la différence entre un stdClass et un Tableau à part le fait qu'ils ne se parcourent pas de la même façon ? Y a t-il un moyen d'uniformiser cela ? (tout en tableau ou tout en stdClass) si oui, quelle est la meilleure solution ?

    Je pourrais me contenter de cela mais j'ai du mal à passer à autre chose sans avoir fait le tour du code que je suis en train de faire.

    Merci encore pour votre aide.

  16. #16
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    d'un côté tu as un objet (de la classe stdClass), et de l'autre un 'simple' tableau.

    Il est tout à fait possible de tout harmoniser, dans un sens ou dans l'autre. Donc soit conversion de l'objet en tableau, soit création d'un objet à stocker dans ta session.

    Pour la meilleure solution, je n'ai personnellement pas d'avis bien défini...

    Si tu veux passer par des tableaux, le plus simple me semble de créer une classe dérivant de Zend_Auth_Adapter_DbTable, utilisée comme adaptateur pour l'authentification, et ayant une méthode renvoyant les données sous forme de tableau au lieu d'objet (ce qui est assez simple, les données étant déjà stockées dans le tableau associatif protégé $_resultRow).

    Si tu veux travailler avec des objets, il faut que tu crées des nouveaux objets pour chaque appli, et que tu définisse leurs propriétés, par exemple (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $data = new stdClass();
    $data->{'AppliCenter'} = $authAdapter->getResultRowObject(null, 'member_password');
    $dataAppli1 = new stdClass();
    $dataAppli1->{'member_add_data'} = 'Ma variable 1';
    // ...
    $data->{'Appli1'} = $dataAppli1;

  17. #17
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    Oki, bon ba avec toutes ces pistes, j'en suis enfin arrivé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $auth_array = array('AppliCenter' => $authAdapter->getResultRowObject(null, 'member_password'));
     
    $auth->getStorage()->write($auth_array);
     
    $auth_appli1_array = new stdClass();
    $auth_appli1_array->{'member_add_data'} = 'Ma variable 1';
    $auth_appli1_array->{'member_add_data_2'} = 'Ma variable 2';
     
    $auth_array['Appli1'] = $auth_appli1_array;
    $auth->getStorage()->write($auth_array);
    Merci encore.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/10/2013, 16h49
  2. [ZF 1.11] Authentification sur deux colonnes
    Par Eixurit dans le forum Zend_Acl & Zend_Auth
    Réponses: 3
    Dernier message: 24/03/2011, 17h54
  3. [PHP 5.2] Authentification sur deux sites
    Par deglingo592003 dans le forum Langage
    Réponses: 8
    Dernier message: 08/09/2009, 13h00
  4. Caption sur deux lignes sur un bouton?
    Par Jayceblaster dans le forum Delphi
    Réponses: 4
    Dernier message: 09/06/2006, 13h57
  5. Sum de deux champs sur deux tables différentes
    Par kluh dans le forum Oracle
    Réponses: 11
    Dernier message: 29/09/2005, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo