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
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
nauc se, jak spravne pouzivat jmenne prostory: http://php.net/…mespaces.php