Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-04-2008 12:39:34

Nikkau
Membre
Date d'inscription: 25-03-2008
Messages: 52

[Zend_Auth] Se baser sur l'auth de phpBB3.

Yop,

J'vais avoir à bosser sur un site qui possèdent 2 parties:
- www.truc.com qui est le site "normal" réalisé avec ZF.
- forum.truc.com qui est le forum associé.

Il faut que les 2 utilisent la même base de comptes.

Je pense utiliser les comptes, et donc l'auth, de phpBB surtout car ça me semble vachement plus simple à mettre en place que l'inverse.

Avant de me lancer j'ai quelques questions.

1) On va commencer par là, quelqu'un a déjà tenter le coup? smile
Si oui, j'accepte volontiers du feedback et évidement du code smile .

2) J'ai une première idée de comment faire et j'aimerai bien l'avis de ceux qui connaissent bien Zend_Auth et/ou phpBB3.

phpBB3 fournit vachement d'API pour utiliser son code sur le reste du site, ce qui permet de gérer l'auth ressemble à:

Code:

define('IN_PHPBB', true);
$phpbb_root_path = './forum/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

include($phpbb_root_path . 'common.' . $phpEx);

$user->session_begin();

Le but étant simplement de récupérer $user->data->user_id et $user->data->username pour mes applis sur le site.

Mon idée première est de ne pas utiliser d'adapter car l'auth se fera par le formulaire du forum qui est facilement déportable sur le site, c'est le moteur de phpBB3 qui s'occupera d'écrire les cookies/sessions qui vont bien.

Mais d'utiliser un Zend_Auth_Storage custom pour avoir la persistance de cette session phpBB sur le site.

Je suppose qu'il faut faire un truc genre:

Code:

<?php
require_once 'Zend/Auth/Storage/Interface.php';

class MonStockage implements Zend_Auth_Storage_Interface
{
    public $id;
    public $username;

    public function __construct()
    {
        // Ici je mets le code décris plus haut et si je trouve qqc, je remplis mes 2 variables d'instances
    }

    public function isEmpty()
    {
        // Je réponds oui si j'ai rien trouver
    }

    public function read()
    {
        // Ici je renvoie id et/ou username
    }

    public function write($contents)
    {
        //Logiquement rien ici
    }

    public function clear()
    {
        // Je sais pas trop ici
    }

}

J'ai pas le temps de tester tout de suite mais ça me tourne dans le crâne donc j'avais besoin de poser l'idée quelque part, ce forum me semblait adapté wink .

A votre avis, est-ce que je pars sur la bonne piste?
Est-ce que quelqu'un a une autre idée?

Merci.

Hors ligne

 

#2 02-07-2008 09:49:29

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

Permet moi de relancer le sujet, je veux faire exactement la même chose.
As tu réussi ?
Pourrais tu montrer à quoi tu es arrivé?
Merci wink

Hors ligne

 

#3 30-01-2009 15:53:16

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

bonjour,

je fait remonter ce sujet, car j'essaie de creer une classe pour récupérer les identifiants d'un utilisateur en utilisant l'API de phpBB :

Code:

<?php
class MyPhpBB {
    
    public $id;
    public $username;

    public function __construct()
    {
        define('IN_PHPBB', true);
        $phpbb_root_path = './forum/';
        $phpEx = substr(strrchr(__FILE__, '.'), 1);
        include($phpbb_root_path . 'common.' . $phpEx);
        $user->session_begin();
    }
    
    public function init()
    {
        
    }
    
    public function getid()
    {
        return $user->data['user_id'];
    }
    
    public function getusername()
    {
        return $user->data['username'];
    }
    
    public function is_registred()
    {
        if ($user->data['is_registered'])
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Mais j'obtient un erreur en faisant :

Code:

$phpbbuser = new MyPhpBB();

Erreur :

Code:

Fatal error: Call to a member function sql_query() on a non-object in ....\forum\includes\cache.php on line 51

qui correspond a cette ligne :

Code:

$config = $cached_config = array();

            $sql = 'SELECT config_name, config_value, is_dynamic
                FROM ' . CONFIG_TABLE;
$result = $db->sql_query($sql); => Ligne 51

j'ai pensé a un nomage double de $db et de $config, mais c'est pas ça.
je pense que c'est la première requete de phpbb, donc une incompatibilité avec Zend_Db_Table.

Si quelqu'un a réussi ou une idée car sinon je vais passer par des requettes perso.

merci d'avance,

Dernière modification par baboune (30-01-2009 16:05:48)

Hors ligne

 

#4 30-01-2009 16:58:42

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

bon j'ai trouvé, c'était un problème de déclaration de varaible :

1°) attention au nommage, $db et $config sont utilisées dans phpbb, variable global.
2°) dans les fonctions, ne pas oublier :

Code:

global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;

pour aider, le début de ma classe :

Code:

class MyPhpBB {
    
        
    public function __construct()
    {       
        global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
        
        define('IN_PHPBB', true);
        $phpbb_root_path = './forum/';
        $phpEx = substr(strrchr(__FILE__, '.'), 1);
        include($phpbb_root_path . 'common.' . $phpEx);
        $user->session_begin();
    }
    
    public function init()
    {
        
    }
    
    public function getid()
    {
        global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
        return $user->data['user_id'];
    }
    
    public function getusername()
    {
        global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
        if ($this->is_registred()) return $user->data['username'];
    }
    
    public function is_registred()
    {
        global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
        if ($user->data['is_registered'])
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

dans un controller par exemple :

Code:

$phpbbuser = new MyPhpBB();
$this->view->phpbb_user = $phpbbuser->getusername();

la vue :

Code:

echo $this->phpbb_user;

on affiche le nom de l'utilisateur si il est connecté.

Dernière modification par baboune (30-01-2009 17:07:39)

Hors ligne

 

#5 01-02-2009 14:47:39

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

donc maintenant, j'ai implémenter Zend_Auth_Adapter :

Code:

class MyAuthPhpBB implements Zend_Auth_Adapter_Interface
{
    private $username;
    private $password;
    private $autologin;
    private $viewonline;
    private $admin = 0;
    
    public function __construct()
    {       
        global $phpbb_root_path, $phpEx, $user, $auth, $db, $config, $cache, $template;
        
        define('IN_PHPBB', true);
        $phpbb_root_path = './forum/';
        $phpEx = substr(strrchr(__FILE__, '.'), 1);
        include($phpbb_root_path . 'common.' . $phpEx);
        $user->session_begin();
        $auth->acl($user->data);
    }
    
    public function setIdentity($name)
      {
        $this->username = $name;
        return $this;
      }

      public function setCredential($pass)
      {
        $this->password = $pass;
        return $this;
      }
      
      public function setAutologin($Autologin)
      {
        $this->autologin = $Autologin;
        return $this;
      }
      
      public function setViewonline($Viewonline)
      {
        $this->viewonline = $Viewonline;
        return $this;
      }
                 
    public function authenticate()
      {
          global $phpbb_root_path, $phpEx, $user, $auth, $db, $config, $cache, $template;
          
          $result = $auth->login($this->username, $this->password, $this->autologin, $this->viewonline, $this->admin);
          
          $PhpBB_identity = new stdClass();
        foreach ($user->data as $key => $val)
        {
            $PhpBB_identity->$key = $val;
        }
                    
          $authResult = array(
                   'code' => Zend_Auth_Result::FAILURE,
                   'identity' => $PhpBB_identity,
                   'messages' => array()
                  );
  
        if ($result['status'] != LOGIN_SUCCESS)
           {
          $authResult['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND;
          $authResult['messages'][] = 'Erreur d\'authentification';
        }
        else
        {
          $authResult['code'] = Zend_Auth_Result::SUCCESS;
          $authResult['messages'][] = 'Authentification reussi';
        }
      
        return new Zend_Auth_Result($authResult['code'],$authResult['identity'],
                                    $authResult['messages']);

      }    
}

ça marche bien ! sauf que j'ai un message d'erreur avec Zend_loader :

Code:

[phpBB Debug] PHP Notice: in file H:/xampp/htdocs/......../library/Zend/Loader.php on line 83: Zend_Loader::include_once(utf/normalizer.php) [function.Zend-Loader-include-once]: failed to open stream: No such file or directory
[phpBB Debug] PHP Notice: in file H:/xampp/htdocs/........./library/Zend/Loader.php on line 83: Zend_Loader::include_once() [function.include]: Failed opening 'utf/normalizer.php' for inclusion (include_path='.;./library;./library/My/;./application/default/models/;./application/login/models/;./application/actualite/models/;./application/association/models/;./application/partenaires/models/;./application/liens/models/;./application/telechargements/models/;./application/equipes/models/;./application/contacts/models/;./application/photos/models/;.;H:/xampp/php/pear/')

et la je vois pas du tout, le fichier s'appelle  en faite utf_normalizer.php, donc il cherche utf/normalizer.php.
Mais pourquoi zend_loader essai de l'inclure ?

Dernière modification par baboune (01-02-2009 15:47:02)

Hors ligne

 

#6 01-02-2009 15:13:16

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

bon j'ai trouver une parade, mais c'est du bricolage tout ça smile :

dans __construct()
je force tout simplement l'inclusion :

Code:

require('./forum/includes/utf/utf_normalizer.php');

et maintenant plus de message, si vous comprenez le pourquoi, ça m'interresse de comprendre.

Hors ligne

 

#7 01-02-2009 16:46:25

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

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

Hello,

C'est pas du bricolage. C'est simplement que tu as activé l'autoload et que ce fichier ne respecte pas la notation Zend. C'est le problème quand tu charges des fichiers d'une autre librairie dont les règles de nommage ne sont pas les mêmes que celles du ZF. Ceci n'arrive pas par exemple avec les librairies PEAR car elles ont les mêmes conventions que le ZF.

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 30-03-2009 17:08:05

gordontesos
Membre
Date d'inscription: 18-03-2009
Messages: 10

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

Bonjour.

Je suis également en train de développer un site qui s'appuie sur une authentification phpBB3, et j'ai également rencontré ce genre de problème : après avoir colmaté "à la va-vite" en incluant manuellement les fichiers du forum, je me retrouve assez souvent confronté à une exception

Code:

Object of class stdClass could not be converted to string/array

La première occurrence ayant eu lieu dans auth.php (je l'ai rafistolé en redéclarant un tableau dans le fichier même), la seconde dans db/dbal.php. Je soupçonne la source de ce problème d'être l'ordre d'inclusion des fichiers, mais, si c'est le cas, comment corriger cela ?

Merci de vos réponses.

Dernière modification par gordontesos (30-03-2009 17:08:52)

Hors ligne

 

#9 30-03-2009 17:35:51

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

bonjour,

il faudrait que tu détaille un peu plus ton code, mais si utilise la class MyAuthPhpBB
c'est peut être du a cette parti là :

Code:

$PhpBB_identity = new stdClass();
        foreach ($user->data as $key => $val)
        {
            $PhpBB_identity->$key = $val;
        }

je converti le tableau de $user->data (par exemple : $user->data[username]) en objet pour être plus conforme avec zend ($this->auth->getIdentity()->username)

Hors ligne

 

#10 30-03-2009 18:00:02

gordontesos
Membre
Date d'inscription: 18-03-2009
Messages: 10

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

En fait, le problème s'applique en ce moment sur la tentative d'écriture un post sur le forum (via un module de commentaires de news, qui s'appuie sur ce forum) :
L'inclusion des fichiers du phpBB est :

Code:

define('IN_PHPBB', true);
$phpbb_root_path = '../forum/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);


include_once($phpbb_root_path . 'common.' . $phpEx);
include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
include_once($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
include_once($phpbb_root_path . 'includes/message_parser.' . $phpEx);

Avec ces inclusions, je parviens à ne plus avoir d'erreurs du Zend_Loader. Cependant, j'ai toujours l'exception sur la stdClass, donc je ne pense pas que créer un adaptateur d'authentification au sein de ZF puisse corriger ce problème.

Hors ligne

 

#11 23-12-2009 02:26:43

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

Bonjour !

Je sais que je "déterre" le sujet, mais j'ai actuellement le même problème...

Quelqu'un pourrait-il donner une solution complète et explicite ?

Hors ligne

 

#12 16-02-2011 22:58:41

Aure77
Membre
Date d'inscription: 08-02-2010
Messages: 21

Re: [Zend_Auth] Se baser sur l'auth de phpBB3.

Bonjour,

J'ai réussi l'authentification avec la classe de baboune.
Tout fonctionne bien (après quelques modifs bien sur), malheureusement, il me manque une fonction :
comment créer une instance Zend_Auth si un cookie de phpbb existe (si $user->data est OK au démarrage du navigateur).

Car j'ai pas trouvé comment créer l'objet Zend_Auth sans passer par la méthode authenticate...

Voici l'action au moment ou le user se connecte :

Code:

$auth = Zend_Auth::getInstance();        
$this->view->auth = $auth;

global $user;
if($auth->hasIdentity()) {            
    // Mise à jour des données de l'authentification
    if (null != $user && $user->data['user_id'] != ANONYMOUS) {
        $currUser = $auth->getIdentity();
        foreach ($user->data as $key => $val)
        {
            $currUser->$key = $val;
        }
        $auth->getStorage()->write($currUser); 
    }
} else {
    if (null != $user && $user->data['user_id'] != ANONYMOUS) {
        // restauration depuis la session
                // Comment récréer l'objet Zend_Auth ??
    }
}

Merci d'avance.

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