Exception při změně hesla
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- .:M@rt!n:.
- Člen | 201
Ahoj,
při změně hesla v administraci, když uživatel zadá staré heslo jiné,
než je v db tak se mu nevypíše na stránku, že je heslo špatné, ale
vyskočí laděnka s hláškou, že je heslo špatné. Jak zajistit vypsání
ve stránce? Při přihlašovaní a zadání špatného uživatelského jména,
se hláška na stránce normálně vypíše…
<?php
namespace App\Model;
use Nette,
Nette\Utils\Strings,
Nette\Security\Passwords;
/**
* Users management.
*/
class UserManager extends Nette\Object implements Nette\Security\IAuthenticator {
const
TABLE_NAME = 'admins',
COLUMN_ID = 'id',
COLUMN_NAME = 'name',
COLUMN_SURNAME = 'surname',
COLUMN_USERNAME = 'username',
COLUMN_PASSWORD_HASH = 'password';
/** @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($username, $password) = $credentials;
$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_USERNAME, $username)->fetch();
if (!$row) {
throw new Nette\Security\AuthenticationException('Wrong username', self::IDENTITY_NOT_FOUND);
} elseif (!\Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
throw new Nette\Security\AuthenticationException('Wrong password', self::INVALID_CREDENTIAL);
}
$arr = $row->toArray();
unset($arr[self::COLUMN_PASSWORD_HASH]);
return new \Nette\Security\Identity($row[self::COLUMN_ID], NULL, $arr);
}
/**
* Fixes caps lock accidentally turned on.
* @return string
*/
private static
function removeCapsLock($password) {
return $password === Strings::upper($password) ? Strings::lower($password) : $password;
}
}