Je suis sur un nouveau projet et je dois gérer 2 authentifications différentes : une pour les joueurs et une autre pour les annonceurs.
Les joueurs sont dans une table X et les annonceurs dans une autre Y.

Comment puis je mettre en place un formulaire de connexion unique qui va checker dans les deux tables sans que les requêtes ne soient trop gourmandes ?

11 réponses


Salut, pourquoi avoir deux table User sous cakephp?
si tu utilise les ACL, tu défini tes groupes d'utilisateurs, et ensuite selon le "group_id" tu donne tes actions via tes contrôler.

tu pourra aussi ajouter des préfixe Utilisateur, Annonceur, Admin...... selon le groupe.

<u><strong>ACL Tutoriel</strong></u>
http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html

<u><strong>Core Configuration</strong></u>
http://book.cakephp.org/2.0/en/development/configuration.html#cakephp-core-configuration

Voilà, j'espere que ça t'aidera ;)

Digikube
Auteur

Je ne souhaite pas utiliser le comportement ACL qui est gourmand en requêtes. Je crois par ailleurs qu'il n'est pas adapté à mon cas car j'enregistre des informations bien différentes dans chaque table.

ok ok, et pourquoi pas créer juste une table simple avec tes différents groupes?
ainsi, tu garde une seule table utilisateurs. je pense que c'est plus simple a gérer ainsi.

Après, tu a juste ton champ "group_id" a contrôler.

après, libre a toi au niveau des champs selon les groupes des membres non?

personnellement je trouve que se serais plus simple ainsi, et sans passer par les ACL.

Digikube
Auteur

Euh je vois pas pourquoi enregistrer les information dans les groupes vu que c'est les infos des bonhomme que je veux pas des groupes eux même.

Salut

Voici une idée de solution dans ton app controller

public function beforeFilter(){
        parent::beforeFilter();
        if($this->request->controller=='joueurs'){
            $this->Auth->authenticate = array(
                    'Form' => array(
                    'userModel' => 'Joueur',
                    'fields' => array('username' => 'username', 'password'=>'password'),
                    'scope' => array('Joueur.active' => 1) 
                ),
            );
                $this->Auth->loginAction = array('controller'=>'joueurs','action'=>'login');
                $this->Auth->logoutRedirect = array('controller'=>'joueurs','action'=>'login');
                $this->Auth->authError = "Vous n'avez pas accès à cette page.";
                $this->Auth->authorize = array('Controller');
        }else if($this->request->controller=='annonceurs'){
            $this->Auth->authenticate = array(
                    'Form' => array(
                               'userModel' => 'Annonceur',
                        'scope' => array('Annonceur.active' => 1) 
                    ),
            );
                           $this->Auth->loginAction = array('controller'=>'annonceurs','action'=>'login');
                $this->Auth->logoutRedirect = array('controller'=>'annonceurs','action'=>'login');
                $this->Auth->authError = "Vous n'avez pas accès à cette page.";
                $this->Auth->authorize = array('Controller');
        }
Digikube
Auteur

Ça ça me plait déjà mieux oui en effets même si je pense que les requêtes seront nombreuse. Question on peut pas faire ça a partir d'un Login unique d'après ton code c'est lorsqu'on appel l'action Login soit depuis le controller joueurs soit annonceurs ?

Pour faire ça à partir d'un login unique, il faut pense autrement. Comme te l a exposé justclara42, un peu plus haut, tu peux créer un 'role' a chaque utilisateur sur une table unique qui te servira de login et qui sera lié à la table joueurs ou annonceurs selon son role. Il aura à ce moment là sa propre table, son prefix, son controlleur, ses actions, son template,....
Et oui ce bout de code est selon l'url de login en fonction du contrôleur.

Digikube
Auteur

En tout cas je vois remercie tous les deux je vais plancher la dessus quand j'aurais du temps et je posterais ma solution si j'en trouve une.

N'hésite pas! :)

Digikube
Auteur

Je crois tenir quelque chose ... dans mon AppController j'arrive à connecter les joueurs ou annonceurs en fonction de leur prefix cependant il me manque le fait de faire ça à partir d'un seul formulaire.

Voici ce que j'ai fait :

<?php
class AppController extends Controller {

    var $components = array(
        'Auth' => array(
            'authorize' => array('Controller')
        ),
        'Session');
    public function beforeFilter() {

        $controller = $this->params'controller'];
        $model = Inflector::classify($controller);
        $prefix = strtolower($model);
        if($model == 'User'){ $prefix = 'admin'; }
        $this->Auth->authenticate = array('Form' => array('userModel' => $model));
        $this->Auth->loginRedirect = array('controller' => $controller, 'action' => 'home', $prefix => true);
        $this->Auth->loginAction = array('controller' => $controller, 'action' => 'login', $prefix => false);
        $this->Auth->scope = array($model.'.activated' => 1);
        if(!isset($this->params'prefix'])){
            $this->Auth->allow();
        }
    }
    public function beforeRender(){
        if(isset($this->params'prefix'])){
            $this->layout = $this->params'prefix'];
        }
    }
    public function isAuthorized($user) {
        $prefix = $this->Auth->user('prefix');
        if (isset($prefix)) {
            if(isset($this->params'prefix']) && $this->params'prefix'] != $prefix){
                $this->Session->setFlash("Vous n'avez pas la permission d'accéder à cette page.", 'error');
                $this->redirect('/');
                return false;
            }
            return true;
        }
    }

Qui qu'en penses quoi de tout ça ? :D

Digikube
Auteur

Une idée de la chose ?