2015-01-16 2 views
0

Я застрял в этой проблеме почти неделю. Даже прохождение всех решений в Интернете не помогает мне решить мою проблему. Поэтому я решил задать здесь свою проблему и надеюсь, что я получу решение.cakephp 2.5.7 login-> Auth всегда ложный, даже правильный пароль

Моя проблема в том, почему я всегда получаю AuthFALSE даже мой пароль правильный? Мне удается добавить нового пользователя и хранит зашифрованный пароль, но при попытке входа в систему с помощью этого username и `пароль, он отображает«Неверное имя пользователя или пароль, попробуйте еще раз»

Here is my code.

Спасибо заранее

ответ

0

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

public function login() { 
    if ($this->request->is('post')) { 
     $options = array(
      'conditions' => array(
       'User.username' => $this->request->data['User']['username'], 
       'User.password' => Security::hash($this->request->data['User']['password'], 'sha256', true) 
      ), 
      'fields' => array(
       'User.id', 
       'User.username', 
       'User.group_id', 
       // other fields you need 
      ) 
     ); 

     $userData = $this->User->find('first', $options); 
     if (!empty($userData) && $this->Auth->login($userData['User'])) { 
      $this->redirect($this->Auth->redirectUrl()); 
     } else { 
      $this->Session->setFlash(__('Username, and/or password are incorrect')); 
     } 
    } 
} 

так, нижняя линия должна вручную проверьте, существует ли пользователь с указанным именем пользователя и паролем, а затем войдите в систему. Кстати, пожалуйста, обратите внимание, что login() функции Я передаю массив как этот

array(
    'id' => 1, 
    'email' => '[email protected]', 
    'group_id' => 2 
); 

и не

array(
     'User' => array(
      'id' => 1, 
      'email' => '[email protected]', 
      'group_id' => 2 
     ) 
    ); 

также, вы не хотите, чтобы передать пароль к функции login, если вы используете торт 2.x, от торта Docs http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#identifying-users-and-logging-them-in

в 2.x $ this-> Auth-> Логин ($ this-> request-> данные) будет регистрировать пользователя в с любыми данными, в то время как в 1.3 $ this-> Auth-> login ($ this-> data) попытается определить пользователя сначала и войти в систему только при успешном завершении.

так, в первую очередь, не нужно передавать пароль, но вы должны быть осторожны, чтобы проверить правильный пароль пользователя перед использованием login, потому что, если, как это упоминалось выше, торт будет войти в системе пользователя любых данными.

О хэш-части пароля, пожалуйста, убедитесь, что вы используете один и тот же алгоритм хэширования с той же солью (если используете его и должны), которые вы использовали при регистрации.

редактировать:

попробовать использовать это в BeforeSave в модели

public function beforeSave($options = array()) { 
    parent::beforeSave($options); 

    if (isset($this->data[$this->alias]['password'])) { 
     $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], 'sha256', true); 
    } 
} 

За последнее, что она является лучшей практикой, чтобы сохранить уникальную соль для каждого пользователя (соль должна быть сохранена в БД вместе с пароль пользователя). В тортике для всех паролей используется только одна соль со стороны приложения, и если брандмауэр и приложение скомпрометированы, злоумышленник может генерировать только одну настраиваемую таблицу радуги для всех паролей, но если соль уникальна для каждого пользователя, тогда плохой парень должен создавать пользовательские таблицы радуги для каждого пользователя отдельно, что намного больше работы/времени/денег.

+0

Спасибо за ваш ответ @dav .. BTW, это работа, если я не hash пароль.Но если используется хеширование пароля, пароль не был согласован (когда я пытаюсь войти в систему). Оператор SQL показывает разницу между паролем, хранящимся в БД. Итак, я предлагаю, чтобы хеширующий алгоритм не был таким же. Но я использовал тот же алгоритм хеширования, который есть sha256. Не могли бы вы помочь мне снова найти, где разница в моей модели и контроллере в хешировании? .. Я обновил UserController -> https://gist.github.com/mrar160/07640881793259a77aae – razif

+1

«Итак, в нижней строке нужно вручную проверить, существует ли пользователь с указанным именем пользователя и паролем» И так, как вы это делаете, вы полностью * теряя способность использовать адаптеры аутентификации. – burzum

+0

@razif PLS ​​см. Обновленный ответ, если это не сработает, проверьте файл вида – dav

Смежные вопросы