Nette odmítá Authenticator

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

Zkouším napsat vlastní přihlašovací nástroj a zarazil jsem se u chyby

Service '22_App_BackendModule_Model_Authenticator': No service of type App\BackendModule\Model\Nette\Database\Context found. Make sure the type hint in App\BackendModule\Model\Authenticator::__construct() is written correctly and service of this type is registered.

Podezření na RoboLoader nemám, jelikož je to ve složce /app kam si mimochodem taky sahá.

Config.neon

parameters:


php:
    date.timezone: Europe/Prague


nette:
    application:
        errorPresenter: Error
        mapping:
            *: App\*Module\Presenters\*Presenter

    session:
        expiration: 14 days

    database:
        dsn:        "mysql:host=localhost;dbname=web"
        user:       "web"
        password:   "web"
        options:    [PDO::MYSQL_ATTR_COMPRESS = true]
        debugger:   true        # panel v debugger baru
        explain:    true        # explain dotazů v debugger bar
        reflection: discovered  # nebo conventional nebo classname, výchozí je discovered
        autowired:  true


services:
    - App\RouterFactory
    authenticator: App\BackendModule\Model\Authenticator
    - App\BackendModule\Model\Authenticator
    router: @App\RouterFactory::createRouter

Soubor app/BackendModule/module/Authenticator.php

<?php

namespace App\BackendModule\Model;

use \Nette\Security as NS;

class Authenticator extends \Nette\Object implements NS\IAuthenticator{

    private $database;

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

    public function authenticate(array $credentials) {
        list($email, $password) = $credentials;

        $row = $this->database->table('uzivatele')->where('email', $email)->fetch();

        if(!$row){
            throw new Security\AuthenticationException('Byly zadány nesprávné údaje', self::IDENTITY_NOT_FOUND);
        }elseif(!sha1($password) != $row->heslo){
            throw new Security\AuthenticationException('Byly zadány nesprávné údaje', self::INVALID_CREDENTIAL);
        }

        $arr = $row->toArray();
        return new Security\Identity($row->id, NULL, $arr);
    }

}

Zkoušel jsem example v Gitu zkoušel jsem se inspirovat i u systému zdejších postavených na Nette a neuspěl jsem. Máte někdo nápad co by s tím bylo, krom toho že je to rozbité? :)

Editoval filipsedivy (29. 8. 2014 10:10)

enumag
Člen | 2118
+
+3
-

public function __construct(\Nette\Database\Context $database) {

Zpětné lomítko na začátku. A nápad: příště si pozorně přečti chybu co ti nette hází.

Editoval enumag (29. 8. 2014 10:18)

filipsedivy
Člen | 37
+
0
-

Děkuji mockrát, ještě mám jednu chybu a snad poslední

Service 'user': Multiple services of type Nette\Security\IAuthenticator found: 22_App_BackendModule_Model_Authenticator, authenticator

Z chyby dokážu dekódovat to že se jedná o to že již jakýsi authenticator byl nalezen, ale nemohu se dohledat kde přesně.

Matey
Člen | 142
+
+1
-

registruješ 2× ten istý, nebude to tým?

authenticator: App\BackendModule\Model\Authenticator
- App\BackendModule\Model\Authenticator

stačí ak tam necháš

- App\BackendModule\Model\Authenticator

Editoval Matey (29. 8. 2014 10:31)

David Kudera
Člen | 455
+
+1
-

Vlastně to spíš říká, že tam máš víc služeb stejnýho typu:

services:
	authenticator: App\BackendModule\Model\Authenticator
	- App\BackendModule\Model\Authenticator

takže tu první smaž

pavelmlejnek
Člen | 16
+
+1
-

Přesně jak je napsáno v chybě, máš Authenticator zaregistrovaný 2×. V config.neon ti stačí pouze toto:

services:
    - App\RouterFactory
    - App\BackendModule\Model\Authenticator

edit: byl jsem pomalý :)

Editoval pavelmlejnek (29. 8. 2014 10:34)

filipsedivy
Člen | 37
+
0
-

Tady pak ale nastává problém že se nemůže dostat k proměnné

Notice

Trying to get property of non-object

Přihlášení

public function loginSubmit(\Nette\Application\UI\Form $form){

            $data = $form->getValues(TRUE);

            try{
                $this->getUser()->login($data->email, $data->heslo);
            }catch(Nette\Security\AuthenticationException $ex){
                $form->addError($ex->getMessage());
                return;
            }

            $this->flashMessage('Byl jste úspěšně přihlášen', 'success');
            $this->redirect('Admin:dashboard');
        }
David Kudera
Člen | 455
+
+1
-

filipsedivy napsal(a):

Tady pak ale nastává problém že se nemůže dostat k proměnné

ještě teda prosím napiš, k jaké proměnné se to vlastně nemůžeš dostat

filipsedivy
Člen | 37
+
0
-

Vypadá to na řádek,

$this->getUser()->login($data->email, $data->heslo);

Což by měl být ale nesmysl jelikož Authenticator dědí od původního objektu který je normálně přístupný.

David Kudera
Člen | 455
+
+4
-

vypadá? chtělo by to vědět trochu víc najisto.. Jo už vidím.. $form->getValues(true) to vrací pokud se nepletu jako pole.. takže vynechej to true nebo přistupuj takhle: $data['email']

filipsedivy
Člen | 37
+
0
-

Super, převedeno na přístup jako pole a již jsem přihlášen :-)

Díky všem za pomoc :)