Bonjour,
J'ai fais le tutoriel concernant un site en 4 jours avec cakephp et actuellement j'ai commencer a intégré un système de memebre mais le soucis c'est que j'arrive pas a me connecter. Le mot de passe est hashé lors de l'envoi dans la base de donnée et lors de la connexion les mot de passes sont différent
Ci-dessous mon UsersController.php

<?php
class UsersController extends AppController{
    function admin_index(){
        $d'users'] = $this->Paginate('User');
        $this->set($d);
    }
    function admin_edit($id = null){
        if($this->request->is('post') || $this->request->is('put')){
            $d = $this->request->data'User'];
                if($d'password'] != $d'passwordconfirm']){
                    $this->Session->setflash("Les mots de passes ne correcpondent pas ","notif",array('type'=>'error'));
                }else{  
                if(empty($d'password']))
                    unset($d'password']);
                $this->User->save($d);
                $this->Session->setflash("L'utilisateur a bien été enregistré ",'notif');
                    }
        }elseif($id){
            $this->User->id = $id;
            $this->request->data = $this->User->read('id,username,role');   
        }
            $d = array();
            $d'roles'] = array(
                'admin' => 'admin',
                'user' => 'membre'          
            );
                $this->set($d);
    }

    function admin_delete($id){
        $this->User->delete($id);
        $this->Session->setflash("l'utilisateur a bien été supprimé ","notif");
        $this->redirect($this->referer());
    }

    function signup(){
        if($this->request->is('post')){
        $d = $this->request->data;
        $d'User']'id'] = null;      
            if(!empty($d'User']'password'])){
                $d'User']'password'] = Security::hash($d'User']'password'],null,true);
                }   
            if($this->User->save($d,true,array('username','password','role','mail'))){
                $link =array('controller'=>'users','action'=>'activate',$this->User->id,'-'.md5($d'User']'password']));
                App::uses('CakeEmail','Network/Email');
                $mail = new CakeEmail();
                $mail->from('noreply@localhost.com')
                    ->to($d'User']'mail'])
                    ->subject('Test::Inscription')
                    ->emailFormat('html')
                    ->template('signup')
                    ->viewVars(array('username'=>$d'User']'username'],'link'=>$link))
                    ->send();   
                $this->request->data = array();                 
                $this->Session->setFlash("Votre compte a bien été créé",'notif');
            }else{
                $this->Session->setFlash("Merci de corriger les erreurs",'notif',array('type' =>'error'));
            }
        }
    }
    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 êtres maintenant connecté",'notif');
                $this->redirect('/');
            }else{
                $this->Session->setFlash("Identifiant incorrecte",'notif',array('type'=>'error'));
                debug(Security::hash($this->request->data'User']'password']));

            }
        }
    }

    function logout(){
        $this->Auth->logout();
        $this->redirect($this->referer());
         /*$this->redirect($this->Auth->logout());*/
    }
    function password(){
    if(!empty($this->request->params'named']'token'])){
        $token = $this->request->params'named']'token'];
        $user = $this->User->find('first',array(
            'conditions' =>array('id' =>$token[0],'MD5(User.password)'=>$token[1], 'active' => 1)
            ));
            if($user){
                $this->User->id =$user'User']'id'];
                $password = substr(MD5(uniqid(rand(),true)),0,8);
                $this->User->saveField('password',Securty::hash($password,null,true));
                $this->Session->setFlash("Votre mot de passe a bien été reinitialisé, voici votre nouveau mot de passe : $password",'notif');
            }else{
                $this->Session->setFlash("Le lien n'est pas valide",'notif', array('type'=>'error'));

            }

    }
        if($this->request->is('post')){
            $v = current($this->request->data);
            $user = $this->User->find('first',array(
            'conditions' => array('mail'=>$v'mail'],'active'=>1)
            ));
                if(empty($users)){
                    $this->Session->setFlash('Aucun utilisateur ne correspond à cet mail','notif', array('type'=>'error'));
                }else{
                    App::uses('CakeEmail','Network/Email');
                    $link =array('controller'=>'users','action'=>'password','token',$user'user']'id'],'-'.md5($user'User']'password']));
                    $mail = new CakeEmail();
                    $mail ->from('noreply@localhost.com')
                        ->to($user'User']'mail'])
                        ->subject('Test::Mot de passe oublié ?')
                        ->emailFormat('html')
                        ->template('mdp')
                        ->viewVars(array('username'=>$user'User']'username'],'link'=>$link))
                        ->send();
                    $this->request->data = array(); 
            }
        }
    }
    function activate($token){
        $token = explode('-',$token);
        $user = $this->User->find('first',array(
            'conditions' =>array('id' =>$token[0],'MD5(User.password)'=>$token[1], 'active' => 0)       
        ));
        If(!empty($user)){
            $this->User->id = $user'User']'id'];
            $this->User->saveField('active',1);
            $this->Session->setFlash("Votre compte a bien été activé",'notif');
            $this->Auth->login($user'User']);
        }else{
            $this->Session->setFlash("Ce lien d'activation n'est pas valide",'notif',array('type'=>'error'));       
            }
                $this->redirect('/');
                die();

    }
    public function edit() {
        $user_id = $this->Auth->user('id');
            if(!$user_id){
                $this->redirect('/');
                die();
            }
                $this->User->id = $user_id;
                $passError = false;
                    if($this->request->is('put') || $this->request->is('post')){
                        $d = $this->request->data;
                        $d'User']'id'] = $user_id;
                        if(!empty($d'User']'pass'])){
                            if($d'User']'pass1'] == $d'User']'pass2']){
                                $d'User']'password'] = Security::hash($d'User']'pass1'],null,true);                     
                            }else{
                                $passError = true;
                            }
                        }   
                            if($this->User->save($d,true,array('firstname','lastname','password'))){
                                $this->Session->setFlash("Votre profit a bien été édité",'notif');                      
                            }else{
                                $this->Session->setFlash("Impossible de sauvegarder",'notif',array('type'=>'error'));
                        }
                        if($passError)

                        $this->User->validationErrors'pass2'] = array('les mots de passe ne correspondent pas');
                    }else{
                        $this->request->data = $this->User->read();
                    }
                    $this->request->data'User']'pass1'] = $this->request->data'User']'pass2'] = '';
            }
}
?>

Et voici mon AppController.php

<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $helpers = array('Text','Form','Html', 'Session', 'Date');

    public $components = array('Session','Cookie',
        'Auth' => array(
            'authenticate' =>array(
                'Form' => array(
                    'scope'=>array('User.active'=>1)
                    )
                )
            )       
    );
    function beforeFilter(){
    $this->Auth->loginAction =array('controller'=>'users','action'=>'login','admin'=>false);
/** Système d'authentification par controller*/
    $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';
        }
    }
    function isAuthorized($user){
        if(!isset($this->request->params'prefix'])){
            return true;
        }
        $roles = array(
            'admin'=> 10,
            'user' => 5
        );
            if(isset($roles$this->request->params'prefix']])){
                $lvlAction = $roles$this->request->params'prefix']];
                $lvlUser = $roles$user'role']];
                    if($lvlUser >= $lvlAction){
                        return true;
                    }else{
                            return false;
                    }
                }
                return false;
            }
}

Lors du débug du mot de passe : test
saisi a partir du formulaire :

a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

mot de passe en base de donnée :

ee710ca6d014a126789babb743e06f4c4b235e80

J'ai revu mes code et j'arrive pas a savoir d'ou cela provient mon erreur, toutes mes pages sont bien en UTF-8

La je galère depuis quelques jours ce ce problème

merci de votre aide

Cafreunion

2 réponses


cafreunion
Auteur
Réponse acceptée

Re,
J'ai résolu mon problème de connexion en retirant le Hash a ce niveau :

if(!empty($d'User']'password'])){ $d'User']'password'] = Security::hash($d'User']'password'],null,true); }

Du coup avec le code suivant ca fontionne bien

if(!empty($d'User']'password'])){                 
$d'User']'password'] = $d'User']'password'];                 
}

Cafreunion

Bonjour,
personne n'a une idée sur mon problème; ci-dessous le modèle User.php si ca peut aider

<?php
class User extends AppModel{
    public $validate = array(
        'username' => array(
            array(
            'rule' =>'alphanumeric',
            'required' =>true,
            'allowEmpty' => false,
            'message' => "Votre pseudo n'est pas valide")
        ),
            array(
                'rule' => 'isUnique',
                'message' => "Ce pseudo est déja pris"
                ),          

        'mail' => array(
            array(
            'rule' => 'email',
            'required' => true,
            'allowEmpty' => false,
            'message' => "Votre email n'est pas valide")
        ),
            array(
                'rule' => 'isUnique',
                'message' => "Cet email est déja pris"
                ),

        'password' => array(
                'rule' => 'notEmpty',
                'message' => "Vous devez entrer un mot de passe",
                'allowEmpty' => false
                )
        );
    function beforeSave($options = array()){
        if(!empty($this->data'User']'password'])){
            $this->data'User']'password'] = AuthComponent::password($this->data'User']'password']);
            }
        return true;
    }
}
?>

dans le fichier route.php j'ai les chemins suivant

** PAGE D'ACCEUIL*/
    Router::connect('/', array('controller' => 'posts', 'action' => 'index'));
/ **PAGES** /
    Router::connect('/page/:slug-:id',array('controller'=>'pages','action'=>'show'),array('pass'=>array('id','slug'), 'id'=>'[0-9]+','slug'=>'[a-z0-9\-]+'));
/ **POSTS** /   
    Router::connect('/post/:slug-:id',array('controller'=>'posts','action'=>'show'),array('pass'=>array('id','slug'), 'id'=>'[0-9]+','slug'=>'[a-z0-9\-]+'));
    / **CATEGORY** /
    Router::connect('/categorie/:slug',array('controller'=>'posts','action'=>'category'),array('pass'=>array('slug'),'slug'=>'[a-z0-9\-]+'));

La j'arrive plus a avancer a cause de ce probleme de connexion

Je m'arrache les cheveux malgrès que j'en ai pas beaucoup

merci

Cafreunion