لماذا هو عنصر التوثيق للكيك لا تجزئة كلمة المرور الخاصة بي؟

StackOverflow https://stackoverflow.com/questions/617471

سؤال

وأنا باستخدام للكيك 1.2 مع مكونات المصادقة وACL.

في بلدي عمل تسجيل المستخدم، وكلمة السر يأتي في unhashed. على وجه التحديد، وهذا التعبير:

if ($this->data['User']['password'] !=
    $this->Auth->password($this->data['User']['confirm_password']))

وهذا هو تقييم إلى true، حتى عندما أقدم قيم متماثلة لpassword وconfirm_password. وأنا أعلم أن كلمة السر هي unhashed لأنني عندما إزالة الدعوة إلى Auth->password، تقييم التعبير إلى false.

وتوقعت وحدة مصادقة إلى تجزئة التلقائى كلمة المرور. ما أفعل الخطأ؟

وهنا هو وجهة نظري:

<?php
    echo $form->create('User', array('action' => 'register'));

    echo $form->input('email',
                      array('after' => $form->error(
                        'email_unique', 'This email is already registered.')));
    echo $form->input('password');
    echo $form->input('confirm_password', array('type' => 'password'));
    echo $form->end('Register');
?>

وهنا هي لغتي عمل السجل من وحدة تحكم المستخدم:

function register(){
    if ($this->data) {
        if ($this->data['User']['password'] !=
            $this->Auth->password($this->data['User']['confirm_password'])) {

            $this->Session->setFlash(__('Password and Confirm Password must match.', true));
            $this->data['User']['password'] = '';
            $this->data['User']['confirm_password'] = '';
        }
        else{
            $this->User->create();
            if ($this->User->save($this->data)){
                $this->redirect(array('action' => 'index'), null, true);
            }
            else {
                $this->data['User']['password'] = '';
                $this->data['User']['confirm_password'] = '';
                $this->Session->setFlash(__('Some problem saving your information.', true));
            }
        }
    }
}

وهنا هو بلدي appController حيث أنا وتشمل وحدات Auth وAcl:

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

    function beforeFilter(){
        if (isset($this->Auth)) {
            $this->Auth->allow('display');
            $this->Auth->fields =
              array(
                'username' => 'email',
                'password' => 'password');
            $this->Auth->authorize = 'actions';
        }
    }
}

وماذا أفعل الخطأ؟

هل كانت مفيدة؟

المحلول

سوف

وللكيك لا تجزئة كلمات السر ما لم يتضمن اسم المستخدم قيمة المقدمة. أنا استبدال حقل اسم المستخدم مع البريد الإلكتروني. ومع ذلك، وإعادة تعيين تلك الحقول عن طريق تعيين Auth-> حقول مجموعة. ومع ذلك، كان يفعل ذلك في appController بدلا من userController. حتى تتحرك هذا السطر:

$this->Auth->fields = array('username' => 'email', 'password' => 'password');

ومن appController إلى userController حلها.
الآن يصبح السؤال "لماذا لا يمكنني إعادة Auth-> الحقول في appController؟"

نصائح أخرى

وربما كنت تجاوز AppController::beforeFilter() مع UsersController::beforeFilter() الخاص بك.

ل"إصلاح" ذلك، وضعت للتو parent::beforeFilter() في بداية الدالة.

ويجب تجزئة كلمة مرور قبل الحفظ إلى قاعدة البيانات. ضع هذه الوظيفة إلى نموذج المستخدم الخاص بك:

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

ولا تنسى أن تضع هذا في beforeFilter() إلى وحدة تحكم المستخدمون:

if(in_array($this->action, array('register'))) {
  $this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}

وهذا يعني أن كلمة المرور لن يتم تجزئته خلال عملية التسجيل (في حالة التحقق من صحة الفاشلة شكل السجل).

وأعتقد كنت تبحث عن

hashPasswords ($data)

ونظرة على هذه الصفحات. وينبغي أن نشير لكم في الاتجاه الصحيح. يمكنك أيضا محاولة تغيير مستوى التصحيح في ملف التكوين الأساسية. تغييره من 0 (الإنتاج) إلى 3 يسمح لك أن ترى أنت الانتاج SQL. قد تكون مفيدة.

AuthComponent-طرق

للكيك استكشاف الأخطاء وإصلاحها

وعذرا لا أستطيع أن أفعل أي شيء ولكن النقطة التي في الاتجاه الصحيح. أنا جديدة ب CakePHP.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top