2009-03-06 5 views
1

Ich verwende CakePHP 1.2 mit Auth und ACL-Komponenten.Warum verschlüsselt die CakePHP-Authentifizierungskomponente nicht mein Passwort?

In meiner Benutzerregistrierungsaktion kommt das Kennwort unverhastet an. Insbesondere dieser Ausdruck:

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

Dies true evaluiert, auch wenn ich die gleichen Werte für password und confirm_password einreichen. Ich weiß, dass das Passwort unverschlüsselt ist, denn wenn ich den Anruf auf Auth->password lösche, wird der Ausdruck als false ausgewertet.

Ich erwartete, dass das Auth-Modul automatisch das Passwort hasht. Was mache ich falsch?

Hier ist meine Ansicht:

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

Hier meine Register Aktion des Benutzers Controller ist:

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

Und hier ist mein appController, wo ich die Auth und Acl Module umfassen:

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

Was mache ich falsch?

Antwort

2

CakePHP hackt keine Passwörter, es sei denn, der Benutzername enthält einen übermittelten Wert. Ich ersetze das Feld Benutzername durch E-Mail. Ich habe diese Felder jedoch neu zugeordnet, indem ich das Array Auth-> fields gesetzt habe. Das habe ich aber im appController statt im userController gemacht. Also diese Zeile verschieben:

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

aus appController in userController löste es.
Nun lautet die Frage "Warum kann ich die Auth-> Felder nicht in appController zurücksetzen?"

0

Ich glaube, Sie suchen

hashPasswords ($data) 

Blick auf diesen Seiten. Sie sollten Sie in die richtige Richtung weisen. Sie können auch versuchen, die Debugging-Ebene in der Core-Konfigurationsdatei zu ändern. Wenn Sie es von 0 (Produktion) auf 3 ändern, können Sie Ihre SQL-Ausgabe sehen. kann hilfreich sein.

AuthComponent-Methods

Cakephp troubleshooting

Leider ich etwas tun kann, nicht aber Punkt, den Sie in die richtige Richtung. Ich bin neu in CakePHP.

1

Sie sollten das Passwort vor dem Speichern in der Datenbank hashen. Setzen Sie diese Funktion in Ihrem User-Modell:

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

Und vergessen Sie nicht, dies zu setzen in beforeFilter() an die Benutzer-Controller:

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

Das bedeutet, dass das Kennwort wird nicht während der Registrierung gehasht werden (in Fall einer fehlgeschlagenen Validierung des Registrierungsformulars).

+0

Diese awesome klingt, aber ich bin verwirrt auf eine Sache - Wenn wir angeben, dass das Passwort bei der Registrierung nicht durchsucht werden soll - wie funktioniert das Passwort? Oder ... wann werden wir es hacken? – Dave

2

Du bist wahrscheinlich AppController::beforeFilter() überschrieben mit Ihrem UsersController::beforeFilter().

zu‚reparieren‘es, legte nur parent::beforeFilter() am Anfang der Funktion.

Verwandte Themen