Neden CakePHP kimlik doğrulama bileşeni Şifremi karma değil mi?

4 Cevap php

Ben Auth ve ACL bileşenleri ile CakePHP 1.2 kullanıyorum.

Benim kullanıcı kayıt eylem, şifre unhashed geliyor. Özel olarak, bu ifade:

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

Bu benim password için aynı değerleri sunmak ve confirm_password bile, true değerlendirmek. Ben Auth->password için çağrı kaldırdığınızda, ifade yanlış olarak değerlendirir çünkü parola unhashed olduğunu biliyoruz.

Ben Auth modülü automagically parola hash bekleniyor. Ben yanlış ne yapıyorum?

İşte benim görünümüdür:

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

Burada kullanıcı denetleyicisi benim kayıt eylemdir:

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

Ve burada benim appController I Auth ve Acl modülleri kapsamaktadır:

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

Ben yanlış ne yapıyorum?

4 Cevap

Kullanıcı adınızı sunulan bir değer içeren sürece CakePHP şifreleri karma olmaz. Ben e-posta ile kullanıcı adı alanını değiştirme. Ancak, Auth-> alanlar dizisini ayarlayarak bu alanları remapped. Ancak, yerine userController bir AppController o yapıyordu. Yani bu hattı hareket:

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

out of appController into userController solved it.
Now the question becomes "Why can't I reset the Auth->fields in appController?"

Muhtemelen AppController::beforeFilter() sizin UsersController::beforeFilter() ile geçersiz kılma ediyoruz.

Fonksiyonunun başında parent::beforeFilter() sadece koymak, bunu "düzeltmek" için.

Sen veritabanına kaydetmeden önce parola hash gerekir. Kullanıcı modeli bu işlevi yerleştirin:

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

Ve users denetçisine beforeFilter() bu koymak unutmayın:

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

Bu şifre (kayıt formu başarısız doğrulama durumunda) kayıt işlemi sırasında karma olacak değil demektir.

i arıyoruz düşünüyorum

hashPasswords ($data)

Bu sayfalara bakmak. Onlar doğru yönde işaret etmelidir. Ayrıca çekirdek yapılandırma dosyasında hata ayıklama seviyesini değiştirmeyi deneyebilirsiniz. 3 0 (üretim) onu değiştirerek size sql çıkış görmenizi sağlar. yararlı olabilir.

AuthComponent-Methods

Cakephp troubleshooting

Maalesef ben doğru yönde noktasında size ama bir şey yapamaz. CakePHP yeniyim.