Connexion multiples

Par Digikube, il y a 13 ans


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

Digikube, il y a 13 ans

Ç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 ?

justclara42, il y a 13 ans

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, il y a 13 ans

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.

justclara42, il y a 13 ans

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, il y a 13 ans

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.

burkbo, il y a 13 ans

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');
        }
burkbo, il y a 13 ans

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, il y a 13 ans

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.

burkbo, il y a 13 ans

N'hésite pas! :)

Digikube, il y a 13 ans

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, il y a 13 ans

Une idée de la chose ?