Nette odmítá Authenticator
- filipsedivy
- Člen | 37
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)
- filipsedivy
- Člen | 37
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ě.
- David Kudera
- Člen | 455
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
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
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
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
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
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
Super, převedeno na přístup jako pole a již jsem přihlášen :-)
Díky všem za pomoc :)