Při zadání špatného hesla do login formuláře se zobrazí laděnka s chybou „Špatné heslo“

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

Zdravím, login formulář pracuje v pořádku. Jediná chyba, na kterou nemůžu přijít je: při zadání špatného hesla se zobrazí laděnka s chybou Nette\Security\AuthenticationException #2 – Špatné heslo.

LoginForm

<?php

class LoginForm extends BaseForm {

    public function __construct($parent = NULL, $name = 'LoginForm') {
        parent::__contruct($parent, $name);
        $this->getElementPrototype()->novalidate = 'novalidate';
        $this->addText('userName', NULL)
            ->setAttribute('placeholder', 'E-mail')
            ->addRule(Form::FILLED, 'Zadejte prosím e-mail.');
        $this->addPassword('userPass', NULL)
            ->setAttribute('placeholder', 'Heslo')
            ->addRule(Form::FILLED, 'Zadejte prosím heslo.');
        $this->addSubmit('login', 'Přihlásit');
        $this->addButton('registration', 'Registrovat');
        $this->onSuccess[] = callback($this, 'formSubmited');
    }

    public function formSubmited(LoginForm $form) {
        try {
            $data = $form->getValues();
            $user = $this->getPresenter()->getUser();
            $user->setExpiration('+ 30 minutes', TRUE);
            $user->login($data->userName, $data->userPass);

            $this->getPresenter()->flashMessage('Přihlášení úspěšné', 'success');

            ...
        }
        catch (AuthenticationException $e) {
            $this->getPresenter()->flashMessage($e->getMessage(), 'error');
            $this->getPresenter()->redirect('Public:Login:default');
        }
    }
}

?>

Autheticator

<?php
public function authenticate(array $credentials) {
        $userName = $credentials[self::USERNAME];
        $userPass = $credentials[self::PASSWORD];
        $row = $this->connection->query(...)->fetch();

        if (!$row) throw new AuthenticationException("Uživatel $userName neexistuje.", self::IDENTITY_NOT_FOUND);

        $password =  sha1($userPass . $this->salt);

        if ($password !== $row->password)
            throw new AuthenticationException('Špatné heslo.', self::INVALID_CREDENTIAL);

            ...
        }
        else $identity = new Identity($row->userId, $row->role);

        return $identity;
    }
?>

Díky za řešení!

Jan Endel
Člen | 1016
+
0
-

přepsat

catch (AuthenticationException $e) {

na

catch (Nette\Security\AuthenticationException $e) {

Editoval pilec (9. 10. 2011 20:22)

diablos
Člen | 36
+
0
-

Bohužel nic se nestalo, ale díky za zájem. Ještě bych měl asi dodat, že používám Form místo AppForm, jestli to na to má nějaký vliv.

22
Člen | 1478
+
0
-

Sandbox v ditribuci mimojiné obsahuje i vzor přihlašovacího formuláře včetně Authenticatoru, takže hledej rozdíl. Osobně bych to tipnul na redirect v catch bloku zpracování formuláře.
btw proč používáš Form `místo `AppForm a proč nepoužíváš Nette2?

Editoval 22 (10. 10. 2011 1:02)

diablos
Člen | 36
+
0
-

Protože i v dokumentaci se pracuje s Formem… navíc AppForm jsem nikde ani nenašel. Problém jsem vyřešil následovně – přepsal jsem to do Nette 2 :-) Díky za rady ;)

22
Člen | 1478
+
0
-

Máš v avataru RTFM, ale očividně se toho nedržíš.. dokumentace tam zmiňuje, jak se mají formuláře používat v presenteru… .-)

Editoval 22 (10. 10. 2011 9:44)

diablos
Člen | 36
+
0
-

To je tak, když si jsi něčím jistý a příjde nová verze, kde to jen rychle proletíš a nevšimneš si detailů… :-/