Authenticator has not been set
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Xchos
- Člen | 40
Zdravim,
s nette začínám a pustil jsem se do nette 2.2 .. napsal jsem s autorizaci
pro administrační modul a dostávám exception z
„Nette\InvalidStateException“ – „Authenticator has not been set.“ ..
Není tu někdo kdo by mi byl schopný poradit? v případě že potřebujete
další věc zaslat, dejte vědět – nemám problém cokoliv dodat. (Stavím
na skeletonu z examples na moduly)
AuthPresenter
25:
26: public function renderDefault($key){
27: $this['login']->setDefaults(array('key' => $key));
28: }
29:
30: public function login($form) {
31: $data = $form->getValues();
32: try {
33: if ($data['remember']) $this->getUser()->setExpiration('+14 days', FALSE);
34: else $this->getUser()->setExpiration('+60 minutes', TRUE);
35: $this->user->login($data->username, $data->password);
36: if ($data['key']) $this->restoreRequest($data['key']);
37: $this->redirect("Default:default");
38: }
39: catch (\Nette\Security\AuthenticationException $e){$form->addError($e->getMessage());}
config.neon
services:
authenticator: \AdminModule\Users
Users.php – model
<?php
/*
*
The MIT License (MIT)
Copyright (c) 2014 Lukáš Zelenka [Xchos]
*
*/
namespace AdminModule;
use \Nette\Security as NS;
class Users extends Base implements NS\IAuthenticator {
protected $table = 'users';
public function __construct(\Nette\DI\Container $container) {
parent::__construct($container);
}
public function authenticate(array $credentials) {
list($username, $password) = $credentials;
$row = $this->db->fetch("SELECT * FROM %n WHERE username=%s", $this->table, $username);
if (!$row || $this->password !== $this->hashPassword($password)) throw new \Nette\Security\AuthenticationException("Špatné heslo nebo jméno.", self::INVALID_CREDENTIAL);
$this->db->query("UPDATE %n SET %a WHERE id=%i",
$this->table,
array(
'last_login' => time(),
'login_count' => $row->access+1,
'last_ip' => $_SERVER['REMOTE_ADDR']
),
$row->id);
unset($row->password);
return new \Nette\Security\Identity($row->id, $row->toArray());
}
private function hashPassword($password) {
return md5("mySalt".$password);
}
}