Změna hesla se nezapíše do databáze

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Nevinho
Člen | 77
+
0
-

Nette 2.0 PHP 5.3

Zdravím, dělám webovou aplikaci a mám problémy se změnou hesla. Uživatel si jej může změnit, ale když kliknu na tlačítko tak se smaže formulář a nic se neprovede.

Zde je kód:

UzivatelPresenter:

<?php
class UzivatelPresenter extends BasePresenter
{
    /** @var UzivatelRepository */
    private $uzivatelRepository;

    /** @var Authenticator */
    private $authenticator;

    protected function startup()
    {
        parent::startup();
        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        }
        $this->uzivatelRepository = $this->context->uzivatelRepository;
        $this->authenticator = $this->context->authenticator;
    }

    protected function createComponentPasswordForm()
    {
        $form = new Form();
        $form->addPassword('oldPassword', 'Staré heslo:', 30)
            ->addRule(Form::FILLED, 'Je nutné zadat staré heslo.');
        $form->addPassword('newPassword', 'Nové heslo:', 30)
            ->addRule(Form::MIN_LENGTH, 'Nové heslo musí mít alespoň %d znaků.', 6);
        $form->addPassword('confirmPassword', 'Potvrzení hesla:', 30)
            ->addRule(Form::FILLED, 'Nové heslo je nutné zadat ještě jednou pro potvrzení.')
            ->addRule(Form::EQUAL, 'Zadná hesla se musejí shodovat.', $form['newPassword']);
        $form->addSubmit('set', 'Změnit heslo');
        $form->onSuccess[] = $this->passwordFormSubmitted;
        return $form;
    }


    public function passwordFormSubmitted(Form $form)
    {
        $values = $form->getValues();
        $user = $this->getUser();
        try {
            $this->authenticator->authenticate(array($user->getIdentity()->login, $values->oldPassword));
            $this->uzivatelRepository->setPassword($user->getId(), $values->newPassword);
            $this->flashMessage('Heslo bylo změněno.', 'success');
            $this->redirect('Homepage:');
        } catch (AuthenticationException $e) {
            $form->addError('Zadané heslo není správné.');
        }
    }
}

UzivatelRepository:

<?php

/**
 * Tabulka uzivatel
 */
class UzivatelRepository extends Repository
{
protected function startup()
    {
parent::startup();
        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        }
        $this->uzivatelRepository = $this->context->uzivatelRepository;
        $this->authenticator = $this->context->authenticator;
    }


public function findByName($username)
{
    return $this->findAll()->where('login', $username)->fetch();
}

public function setPassword($id, $password)
{
    $this->getTable()->where(array('ID' => $id))->update(array(
        'heslo' =>md5($password)
    ));
}

}

Diky za pomoc :-)

ViPEr*CZ*
Člen | 817
+
0
-

Dejte toto $this->redirect(‚Homepage:‘); pryč … snad to hodí nějakou chybu ;-)

Nevinho
Člen | 77
+
0
-

Pravda je, že se to k tomu překřeslení na homepage ani nedostane. I po oddělání této části kódu stejný výsledek. Zadám staré heslo i dvakrát heslo nové, dám změnit, formulář se smaže a nic se neprovede…

ViPEr*CZ*
Člen | 817
+
0
-

Vleze to do submitu vůbec?
Proč tam je todle $this->authenticator->authenticate(array($user->getIdentity()->login, $values->oldPassword)); ??? Není už uživatel autenticovaný? Nebude lepší ověřovat staré heslo spíš v metodě setPassword ?

Nevinho
Člen | 77
+
0
-

v databázi na localhostu používám šifrovací metodu md5.

Nevinho
Člen | 77
+
0
-

No já přesně nevím, jen když zdaám všechny hesla a dám odeslat tak se formulář smaže a formulář zústane prázdný a nic se neděje. A co se týče kódu tak jsem si vzdal inspiraci z quickstartu, takže kod pochazi odtud a nevím proč tam ověřuje ještě v této metodě..

Nevinho
Člen | 77
+
0
-

Asi jak si říkal, vůbec se to nezpracuje ten formulář, a nevím proč :-(

ViPEr*CZ*
Člen | 817
+
0
-

Takže sem passwordFormSubmitted() to nevleze? Jaká je url po odeslání (samozřejmě redirect odebrat jak jsem psal výše)?

voda
Člen | 561
+
0
-

Používáš správnou třídu Form? V presenterech je potřeba používat Nette\Application\UI\Form. dokumentace

Nevinho
Člen | 77
+
0
-

tak url po odeslání formuláře je:
http://localhost/…tel/password?…

takže to asi do toho nevleze jak si říkal ani.

A co se týče těch formulářů, měl jsem zato, že v nejnovější verzi už se prefixy používat nemusí. Formulář přihlášení normálně funguje, takže v tom by to být nemělo

ViPEr*CZ*
Člen | 817
+
0
-

Podle url to do té metody vleze. Pro jistotu bych tam zkusil:

public function passwordFormSubmitted(Form $form)
{
   \Nette\Diagnostics\Debugger::dump($form);
}

Mělo by to vydumpovat objekt Form. Pak bych tam zkusil místo dump $this->uzivatelRepository->setPassword($user->getId(), $values->newPassword); a podíval bych se co to generuje za SQL.

Nevinho
Člen | 77
+
0
-

SQL hlásí:
UPDATE uzivatel
SET heslo=?
WHERE (ID = ‚spravce‘)

Params
„3bf2ed99f42d5f162f3a9aa14d176d48“ (32)

Rows
0

Není to v tom řádku WHERE (ID = ‚spravce‘) ? id je číslo a ne řetězec, to je spíš login v tabulce uzivatel co myslíš?

Nevinho
Člen | 77
+
0
-

Teď už se to i překleslí na defaultní stránku po odeslání formuláře, ale heslo se nezmění :-(

vvoody
Člen | 910
+
0
-

Ako vyzerá tvoj Authenticator?

Nevinho
Člen | 77
+
0
-
<?php

/**
 * Uzivatel authenticator.
 */
class Authenticator extends Object implements IAuthenticator
 {
/** @var UserRepository */
	private $uzivatel;



	public function __construct(UzivatelRepository $uzivatel)
	{
		$this->uzivatel = $uzivatel;
	}

	/**
	 * Performs an authentication.
	 * @param  array
	 * @return Identity
	 * @throws AuthenticationException
	 */
	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
		$row = $this->uzivatel->findByName($username);
        if (!$row) {
            throw new AuthenticationException("Uživatel '$username' nebyl nalezen.", self::IDENTITY_NOT_FOUND);
        }

        if ($row->heslo !== md5($password)) {
            throw new AuthenticationException('Nesprávné heslo.', self::INVALID_CREDENTIAL);
        }

        return new Identity($row->login, NULL, $row->toArray());
    }



}
vvoody
Člen | 910
+
0
-
return new Identity($row->login, NULL, $row->toArray());

zmen na

return new Identity($row->id, NULL, $row->toArray());

relogni a precitaj si tento post

Nevinho
Člen | 77
+
0
-

hele, ale ten login tam musí být zase pro přihlášení přece. Když tam dám id, tak mi to zase háže undefined offset 2

Jan Tvrdík
Nette guru | 2595
+
0
-

@Nevinho Buď té lásky a nastuduj si https://forum.nette.org/…v-tomto-foru#….

vvoody
Člen | 910
+
0
-

@Nevinho: pre prihlásenie určite nie, skus zmazať cache.

Nevinho
Člen | 77
+
0
-

Už vše šlape jak má, díky všem za cenné rady.

ViPEr*CZ*
Člen | 817
+
0
-

Nevinho napsal(a):

Už vše šlape jak má, díky všem za cenné rady.

Ahoj, omlouvám se… včéra jsem tu už nebyl.
Tohle tam být může, jen:

return new Identity($row->login, NULL, $row->toArray());

Jen doplním…pak v presenteru:

$this->user->getId();

vrací jméno (řetězec) ze sloupce login a k samotnému IDéčku se dá dostat trochu jinak:

$this->user->identity->data['id'];

Editoval ViPEr*CZ* (12. 11. 2012 12:36)

Nevinho
Člen | 77
+
0
-

Díky za ochotu :-), už vše funguje :-)