Sujet : Gestion utilisateurs / Acl / stockage en base de donnée

Bonjour à tous,

Je souhaiterais aujourd'hui me créer un "Hoathis" de gestion d'utilisateurs qui s'utiliserai comme ceci:

$user = new Hoathis_User(...);

if($user->isLogged()){

    echo 'Vous êtes connecté!';

    if($user->can('addAlbum')){
        
        echo 'Vous pouvez créer un album';
    }
    else {

        echo 'Vous ne pouvez pas créer un album';
    }

}
else {

    echo 'Vous êtes déconnecté!';
}

je vois grosso modo comment faire pour écrire tout les méthodes isLogged(), logout(), login(), getName/Age/etc() et je me dérouillerais également pour stocker ça en bdd.

Ce qui m'amène ici, c'est la gestion des droits!
Je me suis dis que ça valait le coup de se pencher sur les Acl et d'implémenter ça, mon Hoathis.

Seulement après lecture du manuel sur Hoa_Acl (il doit être encore à peu près à jour? dans l'idée du moins),
je n'arrive pas à saisir comment je pourrais d'une part stocker les droits en bdd? est-ce que Hoa_Acl peut sortir une chaine binaire ou autre par groupe?
à ce moment là il suffit d'un champ supplémentaire dans la table "groups".

La question que je me pose, c'est à quel moment je dois faire mes initialisations d'Hoa_Acl, est-ce que j'utilise un singleton pour pas sortir 15 fois les infos de la bdd etc etc

Dans mon idée, je pense que j'aurais une instance d'Hoa_Acl au sein de mon Hoathis_User et

$user->can(...)

sera un raccourcis de

$user->_acl->isAllowed(...)

Voilà c'est un peu fouilli... j'espère que vous pourrez m'apporter une aide wink

Re : Gestion utilisateurs / Acl / stockage en base de donnée

Pk tu met pas directement les methodes create, update, delete dans ton hoathis.

Tu fais des verifs avec acl et si c'est ok tu requete la BDD à partir de ton hoathis ...

Pour ton singleton : pk tu le met pas directement dans ton hoathis_user ??

Dès que tu as besoin du user dans ton controller automatiquement quand tu va faire ton new Hoathis_user tu récup tout ton objet ...

exemple :

class Utilisateur {
 
    /**
     * Prénom de l'utilisateur.
     */
    public $firstname  = 'Ivan';
 
    /**
     * Nom de l'utilisateur.
     */
    public $surname    = 'Enderlin';
 
    /**
     * Moyen de locomotion préféré.
     */
    public $locomotion = 'Sandales';
 
    /**
     * Est un geek ou pas.
     */
    public $isGeek     = 'Il semblerait';

    public function setInDataBase (  ) {
          
          $requete = .........;
    }
}
 
/**
 * On crée maintenant l'utilisateur.
 */
$hywan = new Hoa_Acl_User('hywan', new Utilisateur());
 
/**
 * On l'affecte à un groupe.
 */
$hywan->addGroup($staff);
 
/**
 * On ajoute l'utilisateur.
 */
$acl->addUser($hywan);


// Insertion
$acl->getUser('hywan')->getLibelle()->setInDataBase();

Je sais pas du tout si ça marche mais je ferai comme ça.
Par contre horrible le getLibelle() !!

Dernière fois dit par Ecureuil Virtuel (25 Nov. 2010 14:12)

" L'imagination est plus importante que la connaissance. La connaissance est limitée alors que l'imagination englobe le monde entier, stimule le progrès, suscite l'évolution. " - Life in the cloud :: Getting Started with Hoa - Hoa débutant

Re : Gestion utilisateurs / Acl / stockage en base de donnée

Bonjour,

Je ne vois pas trop pourquoi faire dans ce sens...
Pour moi mon Hoathis sert avant tout à connecter les membres, et à obtenir des infos sur eux...
La partie droit n'est qu'un sous-module si je puis dire...

non?

EDIT: sans parler du contenu de la classe Hoathis_User, comment te servirais-tu de cette dernière?
Sans parler de l'édition et de l'enregistrement en bdd...
Simplement connection/récupérations d'infos/droits!
(quelque chose dans le même style que mon premier exemple)

Dernière fois dit par jojolapine (25 Nov. 2010 15:42)

Re : Gestion utilisateurs / Acl / stockage en base de donnée

Voici un exemple de code que j'ai fait (il y a 1 an)

Un Hoathis_BasicAction :

<?php

importModule('Mysql.~');

/**
 * Class Hoathis_Wiki_Content_BasicAction.
 *
 *
 * @author      Antoine DARCHE <darche.antoine@gmail.fr>
 * @copyright   Copyright (c) 2009 Antoine DARCHE.
 * @license     [url]http://gnu.org/licenses/gpl.txt[/url] GNU GPL
 * @since       PHP 5
 * @version     0.1
 * @package     Hoathis_Wiki
 * @subpackage  Hoathis_Wiki_Content_BasicAction
 */
abstract class BasicAction {

    private $_instance = array();
    protected $mysql = null;



    public function __construct ( $idMod=null ) {

        $this->mysql = Hoathis_Mysql::getInstance();
    }



    public function insert (  ) {

        $data = array();
        foreach($this->data as $key => $val) {
            $data[$this->champs[$key]] = $val;
        }
        $this->data['ID'] = $this->mysql->insert($this->table, $data);
    }

    public function delete (  ) {

        $data = array();
        $data[$this->champs['ID']] = $this->data['ID'];
        $this->mysql->delete($this->table, $data);
    }

    public function update ( $echo=false ) {

        $data = array();
        foreach($this->champs as $key => $val) {
            $data[$val] = $this->data[$key];
        }
        $this->mysql->update($this->table, $data, $this->champs['ID'], $echo);
    }



    public function setAttribute ( $key, $val )
    {
        $this->data[$key] = trim($val);
        return;
    }

    public function getAttributes (  )
    {
        return $this->data;
    }

    public function getAttribute ( $key )
    {
        return $this->data[$key];
    }
}

Permet de manipuler un objet en relation avec la bdd (je n'ai pas fait un extend de Hoa_Database :S)





Et voici un Hoathis qui gère des commentaire :

<?php

importModule('Mysql.~');
importModule('Wiki.Content.Comment');
require_once('BasicAction.php');

/**
 * Class Hoathis_Wiki_Content_Page
 *
 * @author Antoine DARCHE <darche.antoine@gmail.fr>
 * @copyright Copyright (c) 2009 Antoine DARCHE.
 * @license [url]http://gnu.org/licenses/gpl.txt[/url] GNU GPL
 * @since PHP 5
 * @version 0.1
 * @package Hoathis_Wiki
 * @subpackage Hoathis_Wiki_Content_Page
 */
class Hoathis_Wiki_Content_Comment extends BasicAction {

    private static $_instance = array();        // Array Object Wiki_Content_Comment

    protected $table = 'comment';
    private $tableForeign = 'page';
    private $foreignKey = 'id_page';

    protected $champs = array(

        'ID'                 => 'id_comment',
        'ID_PAGE'             => 'id_page',
        'PSEUDO'             => 'pseudo',
        'EMAIL'             => 'email',
        'DATE_CREATE'         => 'date_creation',
        'WEBSITE'             => 'site',
        'COM'                 => 'comment'
    );

    protected $data = array();

    public static function getInstance ( $id=null ) {

        if(!isset(self::$_instance[$id]))
            self::$_instance[$id] = new self($id);

        return self::$_instance[$id];
    }

    public function __construct ($id = null)
    {
        parent::__construct();

        if ($id !== null) {

            // On récupère les données
            $requete = 'SELECT * FROM ' . $this->table . ' WHERE ' . $this->champs['ID'] . ' = ' . $id;
            $res = $this->mysql->getAssoc($requete);

            foreach($this->champs as $key => $val) {
                $this->data[$key] = $res[$val];
            }
        }
        return;
    }


}

Très simple et rapide d'utilisation :

            $this->wiki->getPage($this->titrePage)->getComment()->setAttribute('ID_PAGE', $this->wiki->getPage($this->titrePage)->getAttribute('ID'));
            $this->wiki->getPage($this->titrePage)->getComment()->setAttribute('DATE_CREATE', 'NOW()');
            $this->wiki->getPage($this->titrePage)->getComment()->setAttribute('PSEUDO', $pseudo);
            $this->wiki->getPage($this->titrePage)->getComment()->setAttribute('EMAIL', $email);
            $this->wiki->getPage($this->titrePage)->getComment()->setAttribute('WEBSITE', $site);
            $this->wiki->getPage($this->titrePage)->getComment()->setAttribute('COM', $comm);
            $this->wiki->getPage($this->titrePage)->getComment()->insert();

(ne pas prendre en compte le getPage(...)...)
La méthode getComment() (sans propriété) crée un objet Comment.


Regarde dans la classe Comment il y a le singleton

" L'imagination est plus importante que la connaissance. La connaissance est limitée alors que l'imagination englobe le monde entier, stimule le progrès, suscite l'évolution. " - Life in the cloud :: Getting Started with Hoa - Hoa débutant

Re : Gestion utilisateurs / Acl / stockage en base de donnée

et pour update :
(ici on update l'objet Page car je ne fait pas de MAJ de commentaire ^^)

                $this->wiki->getPage($this->titrePage)->setAttribute('TITLE', stripcslashes($title));
                $this->wiki->getPage($this->titrePage)->setAttribute('URL', ucfirst($this->wiki->formatTitle($title)));
                $this->wiki->getPage($this->titrePage)->setAttribute('TXT', stripcslashes($text));
                $this->wiki->getPage($this->titrePage)->update();
" L'imagination est plus importante que la connaissance. La connaissance est limitée alors que l'imagination englobe le monde entier, stimule le progrès, suscite l'évolution. " - Life in the cloud :: Getting Started with Hoa - Hoa débutant

6

Re : Gestion utilisateurs / Acl / stockage en base de donnée

Et pourquoi pas une table par classe gérant Hoa_Acl ? Tu aurais une table Group, une table Permission, une table User. Et quand tu lis ta base, tu rejoues les instructions montrées dans la documentation : on créé un groupe, on lui donne des droits, on associe un utilisateur à un ou des groupes.

Non ?

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Re : Gestion utilisateurs / Acl / stockage en base de donnée

Si dans l'idée c'est ce qu'il faut faire je pense (j'avais pris un raccourcis en groupant "group" et "permission", ça ne pouvait pas marcher)...

Mais ce que je ne sais pas trop c'est comment articuler mes classes autours...
D'après ce que je comprend d'Ecureuil Virtuel, tu voudrais que je fasse une classe de manipulation de ma table user, à la symfony, avec les méthodes insert(),delete(),get() etc...

Mais je ne suis pas sûr que ça soit ce que je souhaite.
Cette classe me permettrait de créer un objet membre avec ses infos, ses droits, etc... mais je ne suis pas sur qu'une méthode login() y aurait sa place... si?

En gros il faut distinguer l'obtention d'infos sur un utilisateur (pour lister tout les utilisateurs par exemple, ou indiquer quelques infos sur un utilisateur en pied de page d'un article, etc...) et un "véritable" utilisateur qui est devant son écran, se connecte, interagit avec le site...

Que me conseilleriez-vous pour faire cette différence?

8

Re : Gestion utilisateurs / Acl / stockage en base de donnée

L'idée d'Écureuil Virtuel rejoint la mienne sauf que lui encapsule tout le bazar dans une classe User.

L'hydratation de tes ACL va dépendre essentiellement de ton modèle de base de données. Qu'est-ce que tu ne comprends pas ? Je peux t'aider mais il faut que tu m'indiques où tu bloques smile.

Et on parle de modèle, et non pas de truc à la Symfony ... Je suis bien ouvert d'esprit mais faut arrêter de leur attribuer l'invention du feu.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Re : Gestion utilisateurs / Acl / stockage en base de donnée

Attention, je n'attribus rien à symfony, c'est juste que je n'y connait pas grand chose en modèles objets, et que c'était le seul exemple pratique que je connaissais wink
C'était juste pour dire que je parlais d'un objet représentant la bdd... et je ne sais pas trop comment ça s'appelle smile

En fait voilà trois exemples que je ne sais pas comment traiter...:

1 - Sur une page de news, on indique le nom de l'auteur et sa description, moi dans ma tête je ferais quelque chose genre:

$author = new User_Infos($idAuthor);

echo $author->getName();

echo $author->getDescription();

Donc notre utilisateur n'est pas présent on récupère juste des infos dessus.

2 - Maintenant cet utilisateur veut se connecter pour écrire une news:

$real_user = new User_Connected(...);

if($real_user->isConnected() && $real_user->isAllowed('writeNews')){

    //...
}

3 - Cet utilisateur veut modifier son profil:

$real_user = new User_Connected(...);

if($real_user->isConnected() && $real_user->isAllowed('editProfil')){

    //...
    $real_user->setName('snoopy');
}

Est-ce que ces trois utilisations doivent avoir la même classe?
Est-ce qu'il faut que je fasse une classe User qui récupère les infos et faire une classe User_Connected qui hérite de la première et ajoute les méthodes login(),logout(), etc...

C'est assez flou en fait hmm

Dernière fois dit par jojolapine (26 Nov. 2010 10:05)

Re : Gestion utilisateurs / Acl / stockage en base de donnée

Moi j'avais fait une classe User et une classe Register qui manipulai les session et les cookies et récupération des droit de user avec les opérations isConnected et isAllowed.

(je n'ai jamais fais de symphony donc je peux pas te dire la ressemblance :s)

" L'imagination est plus importante que la connaissance. La connaissance est limitée alors que l'imagination englobe le monde entier, stimule le progrès, suscite l'évolution. " - Life in the cloud :: Getting Started with Hoa - Hoa débutant