2009-08-23 3 views
6

Grüße,CakePHP: Clearing Passwort-Feld über gescheiterte Vorlage

Ich gründe ein ziemlich Standard-Anmeldeformular mit Passwortfeld auf.

Das Problem ist, nach einer fehlgeschlagenen Einreichung (wegen leerer Feld, falsches Format usw.), lädt der Controller die Registrierungsseite, aber mit dem Passwort-Feld mit dem Hash-Wert des zuvor eingegebenen Passwortes. Wie mache ich es nach jeder fehlgeschlagenen Einreichung leer?

Ausblick:

echo $form->password('Vendor.password', array('class' => 'text-input')); 

Controller:

Security::setHash('sha1'); 
$this->Auth->sessionKey = 'Member'; 
$this->Auth->fields = array(
    'username' => 'email', 
    'password' => 'password' 
); 

Hilfe sehr geschätzt wird, danke!

Antwort

9

Sie können mit CakePHP Kennwortüberprüfung in ein anderes Problem auf die Straße laufen.

Das Problem ist, dass Kuchen Hash-Passwörter zuerst, dann überprüft, was dazu führen kann, dass die Eingabe fehlschlägt, auch wenn es nach Ihren Regeln gültig ist. Deshalb wird das Passwort in das Eingabefeld Hash anstelle von normal zurückgegeben.


dieses Problem zu beheben, statt der speziellen Feldnamen ‚Passwort‘ verwenden, einen anderen Namen wie ‚tmp_pass‘ verwenden. Auf diese Weise wird cakePHP Auth nicht automatisch das Feld hashen.

Hier ist ein Musterformular

echo $form->create('Vendor', array('action' => 'register')); 
echo $form->input('email'); 
echo $form->input('tmp_pass', array('label' => 'Password','type'=>'password')); 
echo $form->end('Register'); 

In Ihrem Vendor-Modell, do

var $validate = array('email' => 'email', 'password' => ... password rules...); 
nicht Validierungsregeln 'password' statt zuweisen, diese Regeln zu 'tmp_pass', beispielsweise zuweisen

wird

var $validate = array('email' => 'email', 'tmp_pass' => ... password rules...); 

Schließlich implementieren Sie in Ihrem Vendor-Modell beforeSave().

Zuerst prüfen, ob die Daten validiert werden ('tmp_pass' wird anhand Ihrer Regeln validiert).

Wenn erfolgreich, tmp_pass manuell hashen und in $ this-> data ['Vendor'] ['password'] setzen und dann true zurückgeben. Wenn nicht erfolgreich, gebe false zurück.

+1

+1 - das war sehr hilfreich für mich auch, aber ich würde vorschlagen, die richtige 'Auth-> password()' oder 'Auth-> hashPasswords()' Funktionen eher als dich selbst zu salzen und zu hacken. – nickf

+0

Sie sollten ** nicht ** das Passwort selbst mit 'sha1' hashen, da dies ** Inkonsistenzen mit der Art von' Auth' (wenn Sie das verwenden) mit Hashes für das Passwort machen kann. Verwenden Sie stattdessen '$ this-> Auth-> password()'! – deceze

+1

@deceze, mit Blick auf die Quelle, 'Auth :: hashPasswords()' wird die 'User :: hashPassword()' Funktion aufrufen, wenn es definiert ist, während 'Auth :: password()' nicht. – nickf

8

das?

password('Vendor.password', array('class' => 'text-input','value'=>'')) 
+0

Danke, das funktioniert auch. Ist das der Standard, um das zu erreichen, was ich will? –

+0

das ist, wie Sie den Wert eines Eingabefeldes für Formularhelfer setzen –

3

In Ihrem Controller:

function beforeRender() { 
    parent::beforeRender(); 
    $this->data['Vendor']['password'] = ''; 
} 
+0

hmmm, das scheint ein bisschen hacky zu mir, da ich mehrere Arten von Benutzern mit verschiedenen Eigenschaften in der db und könnte mehr in der Zukunft hinzufügen.Aber für jetzt funktioniert es, ich denke, danke :) –