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
+
0
-

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);
    }

}
Šaman
Člen | 2666
+
0
-

Hoď to na GitHub celý, tohle vypadá funkčně, takže chyba bude nejspíš jinde. Jinak třeba ten konstruktor tam je navíc, stejně tak název služby v configu, ale to ničemu nevadí.

Jo a md5 nepoužívej ani osolený.

Editoval Šaman (25. 7. 2014 15:42)

Xchos
Člen | 40
+
0
-

Vyřešeno – v config.neon jsem měl services mimo common:
blbá chyba, ale alespoň vyřešená :)

Šaman
Člen | 2666
+
0
-

Tak jestli jsi se pustil do Nette 2.2 a nepředěláváš nějaký starý projekt, tak doporučuji sekce zrušit (což už defaultně jsou) a raději používat více konfiguračnich souborů.

Xchos
Člen | 40
+
0
-

předělávám co jsem měl na nette 2.0.6 .. Nelíbí se mi to jak jsem tam řešil věci, třeba dibi jsem používal staticky místo abych si to připojil jako službu a tak .. Díky za info, určitě se na to podívám :) .. Až budu hotový dam to na github a nechám si to zkomentovat.