Změna hesla se nezapíše do databáze
- Nevinho
- Člen | 77
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 :-)
- voda
- Člen | 561
Používáš správnou třídu Form? V presenterech je potřeba používat Nette\Application\UI\Form. dokumentace
- Nevinho
- Člen | 77
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
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
<?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
return new Identity($row->login, NULL, $row->toArray());
zmen na
return new Identity($row->id, NULL, $row->toArray());
relogni a precitaj si tento post
- Jan Tvrdík
- Nette guru | 2595
@Nevinho Buď té lásky a nastuduj si https://forum.nette.org/…v-tomto-foru#….
- ViPEr*CZ*
- Člen | 817
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)