Nasıl CakePHP'de şifre karma algoritması değiştiririm?

3 Cevap php

Ben üstüne bir pasta uygulaması koymak için çalışıyorum varolan bir veritabanı var. Eski uygulama şifreleri karma Perl () crypt kullanılır. Ben PHP uygulaması aynı yapmanız gerekir.

Nerede bir standart CakePHP'de app bu değişikliği yapmak için doğru yerdir? Ve ne tür bir değişiklik gibi görünür?

3 Cevap

Ben çalışma var ...

burada benim AppController olduğunu:

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');
    }
}

Daha sonra burada kullanıcı:

<?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;
    }
}
?>

Her şey normal, ben düşünüyorum.

Burada iyi bir kaynaktır: http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/

Aslında Danbury tarafından yukarıda açıklanan yöntem Bunun yerine standart karma algoritması atlamak için özel bir auth bileşeni yaratma sona erdi CakePHP 2.x benim için işe yaramadı:

/ App / Controller / Komponent / 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;
    }
}

... Ve sonra benim denetleyicisi kullanan ...

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

Bu son blok aynı zamanda AppController ve beforeFilter yönteminin içine konabilir. Benim durumumda ben sadece farklı bir kullanıcı modeli ile özel kimlik doğrulaması kullanmak için gidiyordu tek denetleyicisi özellikle koymak için seçin.

Sadece CakePHP 2.4.1 Bu takip, ben md5 olarak depolanan kullanıcı şifreleri mevcut olan eski bir veritabanı için bir ön uç bina edilmiştir (: StaticText: hesap_numarası şifre) ve kullanıcılar, biz bu karma kullanmak için gereken giriş için izin sistem de.

Çözüm oldu:

Bir dosya uygulaması oluşturun / Controller / Komponent / Auth / CustomAuthenticate.php ile:

<?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);
    }

}

Bu dosya _findUser işlevi devraldı ancak normal olarak tüm diğer işlevler için FormAuthenticate defers anlamına gelen "FormAuthenticate uzanır". Bu daha sonra AppController.php düzenleme ve bu gibi AppController sınıfı şey ekleyerek aktive edilir:

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'),
            )
        ),
    )
);

Özellikle ilişkisel dizi anahtarın 'Özel' kullanımını unutmayın.

Son olarak yeni bir kullanıcı oluştururken böylece modeli dosyasına, parola karma için gerekli (benim durumumda account.php de) Ben ekledi:

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;
}