Empfehlungen: Erweiterte Suche

passwort neu setzen

Daten auslesen, verarbeiten und den Views übergeben

passwort neu setzen

Beitragvon sharks » Do 2. Apr 2009, 16:32

ich habe ein problem das mich mittlerweile zur weissglut treibt! ich möchte, dass sich ein user ein neues passwort setzen kann. dazu soll er im view sein altes passwort angeben und zudem ein neues festlegen. meine methode set_password im controller sieht folgendermassen aus:
Code: Alles auswählen
function set_password() {
        if (!empty($this->data)) {
            if ($this->User->field('password', array('User.id'=>$this->Auth->user('id'))) != Security::hash($this->data['User']['old_password'], null, true)) {
                $this->Session->setFlash(__('Sie haben Ihr altes Passwort falsch eingegeben.', true));
                $this->redirect(array('action'=>'set_password'));
            } else {
                if ($this->data['User']['new_password01'] != $this->data['User']['new_password02']) {
                    $this->Session->setFlash(__('Bitte geben Sie für das neue Passwort zweimal das Gleiche ein.', true));
                    $this->redirect(array('action'=>'set_password'));
                } else {
                    $this->data['User']['id'] = $this->Auth->User('id');
                    $this->data['User']['password'] = Security::hash($this->data['User']['new_password01'], null, true);
                    if ($this->User->save($this->data)) {
                        $this->Session->setFlash(__('Sie haben Ihr Passwort erfolgreich geändert', true));
                        $this->redirect(array('action'=>'set_password'));
                    } else {
                        $this->Session->setFlash(__('Es ist ein Fehler aufgetreten. Bitte versuchen Sie es nochmals.', true));
                    }
                }
            }
        }
    }

leider funktioniert diese methode nicht wunschgemäss, es wird immer 'Es ist ein Fehler aufgetreten. Bitte versuchen Sie es nochmals.' ausgegeben und das Passwort wird auch nicht verändert. Merkwürdigerweise funktioniert die Methode aber tadellos, wenn ich im user-Modell die validation-Variable entferne. Woran liegt das? Oder wie muss ich meine set_password-Methode ändern um das gewünschte Ergebnis zu erzielen?!

Danke für Eure Hilfe!!

Hier noch die validation-Variable im user-Modell:
Code: Alles auswählen
var $validate = array(
        'username' => array(
            'minlength' => array(
                'rule' => array('minLength', 3),
                'message' => 'Der Benutzername muss mindestens drei Zeichen lang sein.'
            ),
            'maxlength' => array(
                'rule' => array('maxLength', 20),
                'message' => 'Der Benutzername darf maximal zwanzig Zeichen lang sein.'
            ),
            'checkunique' => array(
                'rule' => array('checkUnique', 'username'),
                'message' => 'Dieser Benutzername ist bereits registriert.',
            ),
        ),
        'mail' => array(
            'email' => array(
                'rule' => array('email'),
                'message' => 'Bitte geben Sie eine gueltige E-Mail-Adresse ein.'
            ),
            'checkunique' => array(
                'rule' => array('checkUnique', 'mail'),
                'message' => 'Diese E-Mail-Adresse ist bereits registriert.',
            ),
        ),
        'name' => array(
            'rule' => array('alphanumeric'),
            'required' => true,
            'message' => 'Bitte geben Sie einen gueltigen Namen ein.'
        ),
        'surname' => array(
            'rule' => array('alphanumeric'),
            'required' => true,
            'message' => 'Bitte geben Sie einen gueltigen Vornamen ein.'
        ),
        /*'street' => array(
            'rule' => array('alphanumeric'),
            'required' => true,
            'message' => 'Bitte geben Sie eine gueltige Strasse ein.'
        ),*/

        'zip' => array(
            'rule' => array('numeric'),
            'required' => true,
            'message' => 'Bitte geben Sie eine gueltige Postleitzahl ein.'
        ),
        'city' => array(
            'rule' => array('alphanumeric'),
            'required' => true,
            'message' => 'Bitte geben Sie eine gueltige Ortschaft ein.'
        ),
        'phone' => array(
            'rule' => array('numeric'),
            'required' => true,
            'message' => 'Bitte geben Sie eine gueltige Telefonnummer ein.'
        ),
        'created' => array('date'),
        'modified' => array('date'),
        'lastlogin' => array('date'),
        'approved' => array('boolean')
    );
sharks
 
Beiträge: 9
Registriert: Fr 11. Jul 2008, 22:02

Re: passwort neu setzen

Beitragvon euromark » Do 2. Apr 2009, 21:27

hi
hast du eigentlich ne eigene function checkUnique geschrieben?
denn ich kenn nur die core-interne "isUnique" Function dafür
euromark
 
Beiträge: 618
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.1
OS: Windows

Re: passwort neu setzen

Beitragvon sharks » Do 2. Apr 2009, 22:21

ja hab ne eigene funktion dafür, aber daran sollte es ja nicht liegen.

Code: Alles auswählen
function checkUnique($data, $field) {
        $valid = false;
        if ($this->hasField($field)) {
            $valid = $this->isUnique(array($field => $data));
        }
        return $valid;
    }
sharks
 
Beiträge: 9
Registriert: Fr 11. Jul 2008, 22:02

Re: passwort neu setzen

Beitragvon Mathias » Fr 3. Apr 2009, 03:16

Wie sieht denn das data-array aus, was an den Controller geschickt wird? Wenn du versuchst, den User so zu speichern und du vorher vergessen hast, die ganzen Daten in das array zu packen, wird er natürlich meckern, dass zum Beispiel die Stadt o.ä. fehlt.

Ebenso könntest du den Passwortvergleich in das Model packen, da es ja um eine Validierung geht.
Hier mal ein Beispiel aus einem User-Model:
Code: Alles auswählen
<?php
class User extends AppModel {

    var $name = 'User';
    var $useTable = 'users';
    var $displayField = 'username';
   
   
    var $validate = array(
        'first_name' => array(
            array('rule' => 'alphaNumeric'),
            VALID_NOT_EMPTY
        ),
        'last_name' => array(
            array('rule' => 'alphaNumeric'),
            VALID_NOT_EMPTY
        ),
        'username' => array(
            array('rule' => 'alphaNumeric'),
            VALID_NOT_EMPTY,
            array('rule' => array('isUnique'))
        ),
        'email' => array(
            array('rule' => 'email'),
            VALID_NOT_EMPTY
        ),
        'new_password' => array(
            array('rule' => array('identicalFieldValues', 'password2')),
            array('rule' => array('minLength', '5'))
        )

    );
   
    function identicalFieldValues( $field=array(), $compare_field=null ) {
        foreach( $field as $key => $value ) {
            $v1 = $value;
            $v2 = $this->data[$this->name][ $compare_field ];              
            if($v1 !== $v2) {
                return FALSE;
            } else {
                continue;
            }
        }
        return TRUE;
    }
}
?>
cheers
Benutzeravatar
Mathias
 
Beiträge: 225
Registriert: Mi 4. Jun 2008, 22:30
Wohnort: Berlin
CakePHP-Version: 1.3.x
OS: OS X 10.6.x


Zurück zu Controller

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron