Bonjour,

je suis entrain de creer un portail avec plusieurs niveau de droits et j'aimerai que lorsque un utilmisateur avec le role membre se connecte il soit redirigé vers un layout personnalisé et vers une pages bien specifique, j'ai chercher de tout les cotés mais je suis bloqué.
auriez vous une idée pour que je puisse essayer d'avancer?

merci d'avance pour votre aide.

Gilles

je met le code de ma function login du controller users:

function login(){
        if($this->request->is('post')){
            if($this->Auth->login()){
                $this->User->id = $this->Auth->user("id");
                $this->User->saveField('lastlogin' ,date('Y-m-d H:i:s'));
                $this->Session->setFlash("Vous êtes maintenant connecté","notif");
                $this->redirect('/');
            }else{
                $this->Session->setFlash("Votre login ou votre mot de passe ne correspond pas","notif",array('type'=>'error'));
            }
        }
    }

4 réponses


Maenhyr
Réponse acceptée

Tu mets '/' en redirection. Par conséquent tu rediriges en permanence à la racine. Tu peux faire une fonction qui récupèrerait la redirection suivant le role.

Voici mon code et cela fonctionne correctement. Voici mon idée, j'ai un site avec 3 sections, une "user", une "admin" et une "dev". la section admin et dev sont accessibles via http://monsite.com/admin et http://monsite.com/dev ayant chacun un layout different.

/**
 * Connecte l'utilisateur
 *
 * @access  public   
 * @return  void
 */
public function login() {

    /**
     * Si l'utilisateur veut se connecter
     * On le connecte
     * On affiche une notification
     * On le redirige
     */
    if($this->request->is('post')){
        if($this->Auth->login()){
            $this->Session->setFlash("Bonjour, <strong>".$this->Auth->user('username'). "!</strong>", 'notif', array('type' => 'info', 'escape' => false));
            $this->redirect($this->_getRedirectionPath());
        } else{
            $this->Session->setFlash("Identifiants incorrects", 'notif', array('type' => 'info'));
        }
    }
}
/**
 * Redirige vers la partie admin ou dev suivant le role de l'utilisateur
 *
 * @access  private
 * @return  void
 */
private function _getRedirectionPath() {
    if($this->Auth->User('role') == 'admin'){
        $redirect = array('controller' => 'index', 'action' => 'index', 'admin' => true);
    } 
    else if($this->Auth->User('role') == 'dev') {
        $redirect = array('controller' => 'index', 'action' => 'index', 'dev' => true);
    } else {
        // redirection par defaut definie dans app/Controller/AppController
        $redirect = $this->Auth->loginRedirect;
    }
    return $redirect;
}

En l'adaptant, tu devrais pouvoir faire ce que tu veux!

Il te faut mettre en place un système de préfixage qui fera très bien l'affaire.
Voir : http://www.grafikart.fr/tutoriels/cakephp/membres-user-auth-260

gilles40
Auteur

merci PRBARON, nickel ca marche du tonnerre,
autre petite question, pour ce qui est des layout je gere cela par AppController ou par autre chose?

function beforeFilter(){
        $this->Auth->loginAction = array('controller'=>'users','action'=>'login',
            'admin'=>false,
            'user'=>false,
            'flotte' =>false);
        $this->Auth->authorize = array('Controller');

        if(!isset($this->request->params'prefix'])){
            $this->Auth->allow(); 
        }
        if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'admin'){
                    $this->layout = 'admin';

        }       
    }

@+

Gilles

gilles40
Auteur

je me reponds tout seul:

j ai fait cela dans AppController:

function beforeFilter(){
        $this->Auth->loginAction = array('controller'=>'users','action'=>'login',
            'admin'=>false,
            'user'=>false,
            'flotte' =>false);
        $this->Auth->authorize = array('Controller');

        if(!isset($this->request->params'prefix'])){
            $this->Auth->allow(); 
        }
        if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'admin'){
                        $this->layout = 'admin';
        }
        else if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'flotte'){
                    $this->layout = 'flotte';   
                    }
                    else if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'user'){
                    $this->layout = 'assurance';    
                    }
    }

je pense que c'etait la solution.

@+

Gilles