Bonjour à tous,

Je voulais savoir s'il était possible d'utiliser la même fonction login pour un administrateur et un membre ?
En effet j'essaye depuis plusieurs heure sans succès, j'arrive à me connecter en tant qu'administrateur mais pas en tant que membre normal.

Voici ma fonction login

function login(){
        if($this->request->is('post')){
            if($this->Auth->login()){
                              if($this->request->data'User']'role']=='admin'){
                                    return $this->redirect('/admin/pages');
                                    $this->Session->setFlash("Vous êtes connecté en tant qu'administrateur","notification");
                                }
                                else { return $this->redirect('/'); }
                        }        
            else{
                $this->Session->setFlash("Login ou mot de passe incorrect","notification");
            }
        }
    }

4 réponses


Mikachu
Réponse acceptée

Essaye ceci:

public function login() {
        if($this->request->is('post')) {
            if($this->Auth->login()) {
                if($this->Auth->user('role') === 'admin') {
                    $this->redirect(array('controller' => 'pages', 'action' => 'index', 'admin' => true));
                    $this->Session->setFlash("Vous êtes connecté en tant qu'administrateur","notification");
                } else {
                    $this->redirect('/');
                }
            } else {
                $this->Session->setFlash("Login ou mot de passe incorrect","notification");
            }
        }
    }
Maenhyr
Réponse acceptée

@Mikachu, c'est vraiment sympa d'aider. Mais je trouve qu'il aurait été bien que tu montres pourquoi son code ne fonctionne pas et comment tu as résolu son problème.

if($this->request->data'User']'role']=='admin'){

Cela ne peut pas fonctionner car $this->request->data correspond aux données du formulaire, envoyées par la vue. Hors je suppose que tu ne remplis pas le rôle dans le formulaire de connexion (ce qui est normal), donc ta condition est toujours fausse.

if($this->Auth->user('role') === 'admin') {

Lorsque tu es connecté, tu as un tableau qui possède toutes les informations de l'utilisateur. C'est ce tableau qu'utilise Mikachu pour résoudre le problème.

Dernier point :

// pas bon
return $this->redirect('/admin/pages');
//bon
$this->redirect(array('controller' => 'pages', 'action' => 'index', 'admin' => true));

Ton code est fonctionnel, mais dans un soucis de bonnes pratiques de développement, il ne faut pas coder directement l'url. C'est un principe qui peut être un peu compliqué à comprendre quand on ne travaille qu'avec CakePHP, mais en gros, le framework réalise lui même la liaison entre l'url et l'action. Il réalise ceci par défaut si aucune route n'est définie :

Router::connect(
    '/{controller}/{action}',
    array('controller' => '{controller}', 'action' => '{action}')
);

Si par contre j'ai envie de changer l'url, je pourrais faire ça :

Router::connect(
    '/pages/index',
    array('controller' => 'users', 'action' => 'index')
);

Et là on peut voir que ton code ne redirigera pas sur l'action voulue alors que le code de Mikachu si.

Tu as raison, la prochaine fois je détaillerais, mais a vrai dire je me suis dis vu qu'il etait sur une bonne logique, a part 2 ou 3 modifs cela aurait été compréhensible.

Mais oui prochaine fois je détaillerais la solution

payz
Auteur

Merci à vous deux, j'ai résolu mon problème :)

J'ai aussi fait un grand pas en avant en comprenant le différence entre :

if($this->Auth->user('role') === 'admin')

if($this->request->data'User']'role']=='admin')

Et concernant les URL j'ai modifié ça