Bonjour,

je vous expose mon soucis, j'ai réaliser l'intégralité du tuto sans aucun soucis, en local sa fonction parfaitement.
Cependant depuis que j'ai uploader le tous sur un serveur 1and1, plus rien ne fonctionne.

Je m'explique:

  • J'ai renommer toutes mes view/name/index,edit,etc... en view/name/admin_index,admin_edit,etc...
    Jusque la pas de problème le système d'authentification marche très bien..
  • Pareillement dans mes controllers, function index() en function admin_index.
  • J'ai bien mon url qui devient ndd/cockpit(prefix dans la video)/controller/action soit : localhost/admin/resume/index (pour ma part)
  • Dans ma conf.php j'ai modifier mon router : Router::connect('','cockpit/resume/index');
    pour rediriger sur la page d'auth soit: "ndd/users/login"

Tout fonctionner très bien jusqu'à maintenant quand j'ai upload le tous sur mon ndd, je me retrouver avec une boucle infinie dans mon "ndd/users/login"

hook.php

if($this->request->prefix == 'admin'){
    $this->layout = 'admin'; 
    if(!$this->Session->isLogged() || $this->Session->user('role') != 'admin'){
        $this->redirect('users/login'); 
    }
}

J'ai essayer de lui mettre des conditions sur le controller sur l'action, et même sur le path_info, cependant rien n'y fait.

UsersController.php function login()

function login(){
        if($this->request->data){
            $data = $this->request->data;
            $data->password = sha1($data->password); 
            $this->loadModel('User'); 
            $user = $this->User->findFirst(array(
                'conditions' => array('login' => $data->login,'password' => $data->password
            )));
            if(!empty($user)){
                $this->Session->write('User',$user); 
            }
            $this->request->data->password = ''; 
        }
        if($this->Session->isLogged()){
            if($this->Session->user('role') == 'admin'){
                $this->redirect('cockpit');
            }else{
                $this->redirect('');
            }
        }
    }

Ma view login.php

<div class="page-header">
    <h1>Zone réservé</h1>
</div>  
    <form action="<?php echo Router::url('users/login'); ?>" method="post">
        <?php echo $this->Form->input('login','Identifiant'); ?>
        <?php echo $this->Form->input('password','Mot de passe',array('type'=>'password')); ?>
        <div class="actions">
            <input type="submit" class="btn primary" value="Se connecter">
        </div>
    </form>

Quelqu'un aurait une idée pour ne plus avoir se problème de boucle infinie mais garder ce mode d'authenfication direct au chargement de l'url ?

Cdt

5 réponses


Je crois que $this->redirect(''); créé une boucle de redirection infini.

Dans ton cas, tu l'appelles si on arrive à se logguer mais pas en tant qu'administrateur.

$this->redirect('/'); pour aller à la racine du site ? J'imagine que cette fonction redirige vers une adresse URL donnée. Par conséquent, si tu es sur la page de login, tu est redirigé vers la page de login qui vérifie que tu es connecté et refait tout le processus, d'où la boucle de redirection infinie. :-)

Toutefois, ce que tu pourrais faire c'est modifier un peu le code :

// Pour tout dire, tu seras seulement redirigé lorsque des données seront envoyés (enfin... presque)
// C'est ton choix, laisses-tu l'utilisateur la possibilité de se connecter alors qu'il l'est toujours ?
// Si ta réponse est oui, tu peux prendre ce code, sinon... garde seulement ta version avec $this->redirect('/');
if($this->request->data)
{
    $data = $this->request->data;
    $data->password = sha1($data->password); 
    $this->loadModel('User'); 
    $user = $this->User->findFirst(
        array('conditions' => 
            array('login' => $data->login,
                  'password' => $data->password
                )
            )
        );
    if(!empty($user))
        $this->Session->write('User',$user); 
    $this->request->data->password = ''; 
    if($this->Session->isLogged())
    {
        if($this->Session->user('role') == 'admin')
            $this->redirect('cockpit');
        else
            $this->redirect('/');
    }
}

Ramz.

Ca ressemble quand même grave à du code de Cake tout ça. Si tel est le cas, voici ma fonction de connexion :

public function signin() {
        if(AuthComponent::user('id')) {
            $this->redirect('/');
        } else {
            if($this->request->is('post')) {
                if($this->Auth->login()) {
                    $this->User->id = AuthComponent::user('id');
                    $this->User->saveField('lastlogin', date(DATE_ATOM));
                    $this->Session->setFlash('Vous êtes maintenant connecté.', 'notif', array('type' => 'success'));
                    $this->redirect($this->Auth->redirectUrl());
                } else {
                    $this->Session->setFlash('Identifiants incorrects ou compte inactif.', 'notif', array('type' => 'danger'));
                }
            }
        }
    }
  • Si l'utilisateur est connecté, on le redirige à l'accueil du site

  • Si il parvient à se connecter, on le redirige vers l'url d'où il arrive

  • Sinon, on le laisse sur la page de connexion

Bonjour.
Ca ressemble quand même grave à du code de Cake tout ça.
C'est tout à fait normal, étant donné que Grafikart s'est grandement inspiré du système de CakePHP pour créer le MVC pour PHP du tutoriel.
Peut-être pour leur permettre de ne pas avoir trop de difficultés à se familiariser au code de CakePHP dans le cas où ils voudraient utiliser le Framework.
Donc évites de leur donner du code CakePHP alors que c'est bien le MVC pour le PHP du tutoriel et non un problème lié à CakePHP.
Au passage djomobil , évites ton HELP dans le titre du sujet, tous ceux qui viennent poster des sujets dans cette section demandent de l'aide, tu n'es pas une exception.
Sinon l'analyse de Ramzz1994 est correcte, ton redirect sans spécification en paramètre fait probablement la boucle infinie dans ta fonction login.
Donc modifies ton redirect et ton problème devrait être réglé.

J'allais écrire quelque chose de plus étoffé hier au sujet de la programmation, mais j'ai laissé tombé. Je pense que les gens ne devraient pas commencer par ce tutoriel et surtout ne pas copier coller le code de Grafikart. En fait, je pense qu'il faut apprendre à programmer avant d'utiliser des patrons de conception. MVC n'est pas si simple en réalité, ça implique d'autres patrons (au niveau théorique) qu'à nul part Grafikart n'a glissé le mot.

Je ne pense pas que l'auteur de cet article n'en soit au niveau de choisir de la qualité de bon design de programmation. Commencez par la base d'abord, la logique sera plus facile à concevoir... :-)

Ramz.