Ošetření nesprávně zadaného hesla – UserManager

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

Když zadám při přihlášení nesprávné heslo tak to UserManager správně pozná ale vyhodí mi chybové hlášení „Nette\Security\AuthenticationException #2“ .Asi bych chtěl spíš nějakou Flashmessage. Kde to ale mám řešit? Předělat UserManager nebo to ošetřit v přihlašovacím presenteru ?

UserManager :

<?php

namespace App;

use Nette,
	Nette\Utils\Strings;


/**
 * Users management.
 */
class UserManager extends Nette\Object implements Nette\Security\IAuthenticator
{
	const
		TABLE_NAME = 'users',
		COLUMN_ID = 'id',
		COLUMN_NAME = 'name',
                COLUMN_EMAIL = 'email',
		COLUMN_PASSWORD_HASH = 'password',
		COLUMN_ROLE = 'role';


	/** @var Nette\Database\Context */
	private $database;


	public function __construct(Nette\Database\Context $database)
	{
		$this->database = $database;
	}


	/**
	 * Performs an authentication.
	 * @return Nette\Security\Identity
	 * @throws Nette\Security\AuthenticationException
	 */
	public function authenticate(array $credentials)
	{
		list($email, $password) = $credentials;
		$password = self::removeCapsLock($password);

		$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();

		if (!$row) {
			throw new Nette\Security\AuthenticationException('Email neodpovídá.', self::IDENTITY_NOT_FOUND);

		} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
			throw new Nette\Security\AuthenticationException('Heslo neodpovídá.', self::INVALID_CREDENTIAL);

		} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
			$row->update(array(
				self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
			));
		}

		$arr = $row->toArray();
		unset($arr[self::COLUMN_PASSWORD_HASH]);
		return new Nette\Security\Identity($row[self::COLUMN_ID], $row[self::COLUMN_ROLE], $arr);
	}


	/**
	 * Adds new user.
	 * @param  string
	 * @param  string
	 * @return void
	 */
	public function add($name, $email, $password)
	{
		$this->database->table(self::TABLE_NAME)->insert(array(
			self::COLUMN_NAME => $name,
                        self::COLUMN_EMAIL => $email,
			self::COLUMN_PASSWORD_HASH => Passwords::hash(self::removeCapsLock($password)),
		));
	}


	/**
	 * Fixes caps lock accidentally turned on.
	 * @return string
	 */
	private static function removeCapsLock($password)
	{
		return $password === Strings::upper($password)
			? Strings::lower($password)
			: $password;
	}

}
?>

BasePresenter :

<?php

namespace App\FrontModule\Presenters;

use Nette\Application\UI\Form;

class BasePresenter extends \App\Presenters\BasePresenter {

	/**
	 * Sign-in form factory.
	 * @return \Nette\Application\UI\Form
	 */
	protected function createComponentLoginForm() {
		$form = new Form;
		$form->addText('email','E-mail:')
			->setType('email')
			->addRule(Form::EMAIL, 'E-mail má špatný formát.')
			->setRequired('Prosím zadejte e-mail.');
		$form->addPassword('password','Heslo:')->setRequired('Prosím zadejte heslo.');
		$form->addSubmit('send', 'Přihlásit');

		$form->onSuccess[] = array($this, 'loginFormSucceeded');
		return $form;
	}

	public function loginFormSucceeded(Form $form) {
		$values = $form->getValues();

		try {
			**$this->getUser()->login($values->email, $values->password);**
			$this->redirect('Homepage:');

		} catch (Nette\Security\AuthenticationException $e) {
			$form->addError($e->getMessage('Chyba'));
		}
	}
}
?>
David Matějka
Moderator | 6445
+
0
-

nauc se, jak spravne pouzivat jmenne prostory: http://php.net/…mespaces.php

Mysteria
Člen | 797
+
+2
-
} catch (Nette\Security\AuthenticationException $e) {
// Tohle není to samé jako tohle
} catch (\Nette\Security\AuthenticationException $e) {
brontosaurus
Člen | 49
+
0
-

No jasně. Tak dík.