2009-02-21 1 views
6

У меня есть существующая база данных. Я пытаюсь добавить приложение для торта. Старое приложение использовало crypt() в Perl для хеширования паролей. Мне нужно сделать то же самое в приложении PHP.Как заменить алгоритм хэширования пароля cakephp?

Где подходящее место для внесения изменений в стандартное приложение cakephp? И как это изменится?

ответ

8

Я получил это работает ...

вот мой AppController:

class AppController extends Controller { 
    var $components = array('Auth'); 

    function beforeFilter() { 
     // this is part of cake that serves up static pages, it should be authorized by default 
     $this->Auth->allow('display'); 
     // tell cake to look on the user model itself for the password hashing function 
     $this->Auth->authenticate = ClassRegistry::init('User'); 
     // tell cake where our credentials are on the User entity 
     $this->Auth->fields = array(
      'username' => 'user', 
      'password' => 'pass', 
     ); 
     // this is where we want to go after a login... we'll want to make this dynamic at some point 
     $this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index'); 
    } 
} 

Тогда вот пользователь:

<?php 
class User extends AppModel { 
    var $name = 'User'; 

    // this is used by the auth component to turn the password into its hash before comparing with the DB 
    function hashPasswords($data) { 
     $data['User']['pass'] = crypt($data['User']['pass'], substr($data['User']['user'], 0, 2)); 
     return $data; 
    } 
} 
?> 

Все остальное нормально, я думаю.

Вот хороший ресурс: http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/

2

На самом деле описанный выше метод, danb не работает для меня в CakePHP 2.x Вместо этого я в конечном итоге создать пользовательский компонент аутентификации в обход стандартного алгоритма хеширования:

/app/Controller/Component/Auth/CustomFormAuthenticate.php

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class CustomFormAuthenticate extends FormAuthenticate { 

    protected function _password($password) { 
     return self::hash($password); 
    } 

    public static function hash($password) { 
     // Manipulate $password, hash, custom hash, whatever 
     return $password; 
    } 
} 

... и затем использовать это в мой контроллер ...

public $components = array(
    'Session', 
    'Auth' => array(
     'authenticate' => array(
      'CustomForm' => array(
       'userModel' => 'Admin' 
      ) 
     ) 
    ) 
); 

Этот последний блок также можно поместить внутрь метода beforeFilter из AppController. В моем случае я просто решил включить его в один контроллер, где я собирался использовать пользовательскую аутентификацию с другой моделью пользователя.

+1

Имя файла должно быть CustomFormAuthenticate.php - не CustomFormAuthentication .php –

+0

Спасибо, хорошо поймать – jesal

+0

@jesal Я знаю, что это 5-месячный поток, но знаете ли вы, как структурировать класс CustomFormAuthenticate, если мне нужно использовать cryp с электронной почтой как соль.Очевидно, что электронная почта недоступна на данный момент? Пожалуйста помоги! – rizalp1

1

Просто для того, чтобы следить за этим в CakePHP 2.4.1, я создавал интерфейс для устаревшей базы данных с имеющимися паролями пользователей, хранящимися как md5 (accountnumber: statictext: password), и чтобы пользователи могли войти в систему, мы нуждались для использования этой системы хэширования.

Решение было:

Создайте файл приложения/контроллер/компонент/Auth/CustomAuthenticate.php с:

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class CustomAuthenticate extends FormAuthenticate { 

    protected function _findUser($username, $password = null) { 
     $userModel = $this->settings['userModel']; 
     list(, $model) = pluginSplit($userModel); 
     $fields = $this->settings['fields']; 

     if (is_array($username)) { 
      $conditions = $username; 
     } else { 
      $conditions = array(
       $model . '.' . $fields['username'] => $username 
      ); 

     } 

     if (!empty($this->settings['scope'])) { 
      $conditions = array_merge($conditions, $this->settings['scope']); 

     } 

     $result = ClassRegistry::init($userModel)->find('first', array(
      'conditions' => $conditions, 
      'recursive' => $this->settings['recursive'], 
      'contain' => $this->settings['contain'], 
     )); 
     if (empty($result[$model])) { 
      return false; 
     } 

     $user = $result[$model]; 
     if ($password) { 
      if (!(md5($username.":statictext:".$password) === $user[$fields['password']])) { 
       return false; 
      } 
      unset($user[$fields['password']]); 
     } 

     unset($result[$model]); 
     return array_merge($user, $result); 
    } 

} 

"расширяет FormAuthenticate" означает, что этот файл берет на себя функцию _findUser но отменит FormAuthenticate для всех других функций, как обычно. Это затем активируется путем редактирования AppController.php и добавления к классу AppController что-то вроде этого:

public $components = array(
    'Session', 
    'Auth' => array(
     'loginAction' => array('controller' => 'accounts', 'action' => 'login'), 
     'loginRedirect' => array('controller' => 'accounts', 'action' => 'index'), 
     'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'), 
     'authenticate' => array (
      'Custom' => array(
       'userModel' => 'Account', 
       'fields' => array('username' => 'number'), 
      ) 
     ), 
    ) 
); 

В частности, обратите внимание на использование ассоциативного ключа массива «Пользовательский».

Наконец, необходимо хэш пароля при создании нового пользователя, так модель файла (в моем случае Account.php) Я добавил:

public function beforeSave($options = array()) { 
    if (isset($this->data[$this->alias]['password'])) { 
     $this->data[$this->alias]['password'] = md5($this->data[$this->alias]['number'].":statictext:".$this->data[$this->alias]['password']); 
    } 
    return true; 
} 
+0

Большое спасибо @sverreg! Благодаря вашему отзыву я смог сделать мой процесс паролей! – azerto00

+0

Кроме того, это решение позволит нам выбрать модель, которая будет обрабатывать процесс Auth. – azerto00

+0

Рад помочь :-) – sverreg