2013-09-18 2 views
2

Я пытаюсь реализовать систему входа в систему с помощью bcrypt. У меня этот код на методе BeforeSave() модели пользователя:CakePHP 2.4 Вход в систему сбой с использованием bcrypt

public function beforeSave($options = array()) { 



    if (!$this->id && !isset($this->data[$this->alias][$this->primaryKey])) { // insert 
     /*Hash the password*/ 
     $this->data['User']['password'] = Security::hash($this->data[$this->alias]['password'], 'blowfish'); 

     /*Set the username the same as the email*/ 
     $this->data['User']['username'] = $this->data['User']['email']; 

    } 
    parent::beforeSave($options); 
} 

Этот код успешно хэшей пароль перед сохранением в БД.

Для процедуры входа в систему, я эту форму в представлении:

echo $this->Form->create('User', array('action' => 'login')); 

    echo $this->Form->input('username', array(
     'class' => 'login-input', 
     'placeholder' => $input_username_default_text, 
     'id' => 'username', 
     'label' => false, 
     'div' => false, 
     'type' => 'text' 
    )); 
    echo $this->Form->input('password', array(
     'class' => 'login-input', 
     'placeholder' => $input_password_default_text, 
     'id' => 'password', 
     'label' => false, 
     'div' => false, 
     'type' => 'text' 
    )); 
    echo $this->Form->submit(__('SIGN IN'), array(
     'class' => 'login-input', 
     'type' => 'submit' 
    )); 

... А потом в методе UsersController Логин():

public function login() { 
    $this->set('body_class', 'login-page'); 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { //Always fails... 

      debug('HELLO '.$this->session->read('Auth.User')); 
     } else { 

     } 
    } 
} 

Мой AppController.php

class AppController extends Controller { 

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'Form' => array(
       'passwordHasher' => 'Blowfish' 
      ) 
     ) 
    ) 
); 

}

Логин, используя этот код, всегда терпит неудачу. Любая догадка о том, что я делаю неправильно?

EDIT 1:

Хорошо, я копал в рамках пытаясь понять, где эта процедура не удается. И в этом методе:

// class BlowfishPasswordHasher 
public function check($password, $hashedPassword) { 
     return $hashedPassword === Security::hash($password, 'blowfish', $hashedPassword); 
    } 

... за $ hashedPassword (что хранится в БД) отличается от того, что возвращается из безопасности :: хэш ($ пароль, 'Blowfish', $ hashedPassword). Таким образом, вход в систему не работает. Однако я понятия не имею, почему это происходит.

в моей отладки были получены эти результаты:

$ hashedPassword - $ 2a $ 10 $ f39m7NJBx3fIBrqq/9TZEueNJICJiO1dq1LZKlneF7Y (Спички, что хранится в столбце пароля таблицы пользователей)

результат из Безопасность :: хэш() метод: $ 2a $ 10 $ f39m7NJBx3fIBrqq/9TZEueNJICJiO1dq1LZKlneF7Ykvm35emcPm

Если вы заметили, что они такие же, за исключением того, что результат этого метода имеет 10 дополнительных символов.

+0

Как может beforeSave() фактически создать функцию save(), когда вы никогда не вернетесь сюда? Я не думаю, что спасение на самом деле происходит здесь. – mark

+0

Ну ... это спасает, поверь мне. Я думаю, это потому, что родительский метод возвращает true. – bfilipesoares

+1

Нет, родительский вызов проглатывается, и вместо него здесь возвращается void. Вы должны это исправить, даже если это не проблема. – mark

ответ

5

Если вы заметили, что они одинаковы, за исключением того, что результат метода имеет 10 дополнительных символов.

Похоже, вы не задали длину поля пароля в db достаточно долго, чтобы хранить полный хэш.