Nefungujúci vlastný autentifikátor

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

Zdravím, snažím sa rozbehať vlastný autentikátor pripojený na databázu podla návodu https://doc.nette.org/…thentication#… avšak neustále mi to vyhadzuje chyby, tá posledná bola: Class MyAuthenticator used in service ‚authenticator‘ not found or is not instantiable.

Config.neon:

#
# WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
# https://nette.org/en/security-warning
#
parameters:


php:
	date.timezone: Europe/Prague


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


session:
	expiration: 14 days


services:
	- App\Model\UserManager
	- App\Forms\SignFormFactory
	- App\Model\MyAuthenticator
	router: App\RouterFactory::createRouter
	database: @Nette\Database\Connection
	authenticator: MyAuthenticator( @database )

MyAuthenticator.php uložený v app/model:

<?php

namespace App\Model;

use Nette;

class MyAuthenticator extends Nette\Object implements Nette\Security\IAuthenticator
{
    public $database;

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

    function authenticate(array $credentials)
    {
        list($username, $password) = $credentials;
        $row = $this->database->table('reg')
            ->where('Nazov', $username)->fetch();

        if (!$row) {
            throw new Nette\Security\AuthenticationException('Používateľ sa nenašiel.');
        }

        if (!Nette\Security\Passwords::verify($password, $row->Heslo)) {
            throw new Nette\Security\AuthenticationException('Nesprávne heslo.');
        }

        return new Nette\Security\Identity($row->Id, $row->Role, array('username' => $row->Nazov));
    }
}

Neviete kde robím chybu? Ďakujem.

David Matějka
Moderator | 6445
+
0
-

V neonu nemas uvedeny cely nazev tridy vcetne namespace

JuniorJR
Člen | 181
+
+1
-
authenticator: App\Model\MyAuthenticator( @database )
samson
Člen | 11
+
0
-

JuniorJR napsal(a):

authenticator: App\Model\MyAuthenticator( @database )

Zmenil som to, teraz mám chybu: Service ‚security.user‘: Multiple services of type Nette\Security\IAuthenticator found: 27_App_Model_UserManager, authenticator

JuniorJR
Člen | 181
+
+1
-

samson napsal(a):

JuniorJR napsal(a):

authenticator: App\Model\MyAuthenticator( @database )

Zmenil som to, teraz mám chybu: Service ‚security.user‘: Multiple services of type Nette\Security\IAuthenticator found: 27_App_Model_UserManager, authenticator

@samson Mas dve sluzby, ktere implementuji stejne rozhrani, podivej se do classy App\Model\UserManager a uvidis tam, ze implementuje Nette\Security\IAuthenticator. Musis tuto kolizi vyresit, jednoduse receno se totiz pokousis udelat dvoji implementaci tohoto rozhrani, coz pravdepodobne nechces, takze implementuj pouze na jednom miste. Napr. odstran implements IAutheticator z App\Model\UserManager nebo presun tu svoji logiku do nej a tu novou tridu vyhod.

samson
Člen | 11
+
0
-

Super, ďakujem, už to chybu nevyhadzuje. Ja som ani UserManager neotváral, ten tam proste bol odkedy som to stiahol. Stále mi však nefunguje prihlásenie cez databázu, hoci Tracy ukazuje ten SQL kód podľa mňa správny:

SELECT `Id`, `Heslo`
FROM `reg`
WHERE (`Nazov` = 'test')
JuniorJR
Člen | 181
+
0
-

@samson A na cem to „pada“?

samson
Člen | 11
+
0
-

Už som na to prišiel. Ja som nahodil to heslo do databázy ručne a nepoužil som hash, tzn. authenticator rehashoval nezahashované heslo a tým pádom sa nezhodovali. Už to ale ide, ďakujem za pomoc :-)

samson
Člen | 11
+
0
-

Ešte jedna otázočka – práva pre užívateľské skupiny (https://doc.nette.org/…thentication#…) budem pridávať tiež do súboru s autentikátorom?

Podotázka: Kam by som vlastne mal napísať túto časť kódu?

$acl = new Permission;
// definujeme role
$acl->addRole('guest');
$acl->addRole('member');
$acl->addRole('administrator', 'member');  // administrator je potomkem member
// definujeme zdroje
$acl->addResource('file');
$acl->addResource('article');
// pravidlo: host může jen prohlížet články
$acl->allow('guest', 'article', 'view');
// pravidlo: člen může prohlížet vše, soubory i články
$acl->allow('member', Permission::ALL, 'view');
// administrátor dědí práva od člena, navíc má právo vše editovat
$acl->allow('administrator', Permission::ALL, array('view', 'edit'));
// zaregistrujeme autorizační handler
Environment::getUser()->setAuthorizationHandler($acl);

Editoval samson (12. 8. 2015 1:26)