Jak nastavit do configu vlastní autentikátor jinak než celou třídou

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

Zdravím,

chtěl bych se zeptat,
udělal jsem si podobný autentikátor:

https://doc.nette.org/…thentication#…

lze ho použít jinak, než jako celou třídu v services do configu authenticator: ? Chci to mít v jedné třídě starající se o přihlášení a použít jen tu funkci, místo celé třídy příkladu:

services:
    authenticator: MyAuthenticator

nastavit jen tu funkci authenticate nějak takto?

$user->setAuthenticator($authenticator);

Jak to udělat? Moc nechápu smysl těch autentikátorů, není to příliš komplikované?

Děkuji předem za pomoc a reakce :)

CZechBoY
Člen | 3608
+
0
-

Prusujes SRP. Udelej jednu tridu co dela autentizaci a dalsi co dela dalsi vec…

snazimse
Člen | 43
+
0
-

CZechBoY napsal(a):

Prusujes SRP. Udelej jednu tridu co dela autentizaci a dalsi co dela dalsi vec…

Ok a tam to funguje podle nějaké principu, že

use Nette\Security as NS;

class MyAuthenticator implements NS\IAuthenticator
{
    public $database;

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

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

        if (!$row) {
            throw new NS\AuthenticationException('User not found.');
        }

        if (!NS\Passwords::verify($password, $row->password)) {
            throw new NS\AuthenticationException('Invalid password.');
        }

        return new NS\Identity($row->id, $row->role, ['username' => $row->username]);
    }
}

i ta klíčová funkce se musí jmenovat authenticate, protože jak jinak ji najde? Smí tam být i jiné funkce nebo pouze, tak jak to je?

Šaman
Člen | 2666
+
0
-

Toto je typické použití rozhraní (interface).
Tvoje třída může obsahovat cokoliv, ale musí implementovat dané rozhraní (implements Nette\Security\IAuthenticator) a tedy i obsahovat tu metodu authenticate, kterou rozhraní vyžaduje.
To jsou základy OOP.

CZechBoY
Člen | 3608
+
0
-

jj musi se jmenovat authenticate, byt verejna, mit stejny parametry a vracet co je predepsany.

Muzes tam mit jiny metody (i verejny) a pouzivat i jiny tridy (predas pres konstruktor).
Takze kdybys uplne nechtel dodrzovat SRP tak ti staci registrovat tu obrovskou tridu jako sluzbu a si hotovej. Nette si totiz samo dohleda ze nejaka trida implementuje to rozhrani IAuthenticator a pouzije tu tvoji.

snazimse
Člen | 43
+
0
-

Šaman napsal(a):

Toto je typické použití rozhraní (interface).
Tvoje třída může obsahovat cokoliv, ale musí implementovat dané rozhraní (implements Nette\Security\IAuthenticator) a tedy i obsahovat tu metodu authenticate, kterou rozhraní vyžaduje.
To jsou základy OOP.

CZechBoY napsal(a):

jj musi se jmenovat authenticate, byt verejna, mit stejny parametry a vracet co je predepsany.

Muzes tam mit jiny metody (i verejny) a pouzivat i jiny tridy (predas pres konstruktor).
Takze kdybys uplne nechtel dodrzovat SRP tak ti staci registrovat tu obrovskou tridu jako sluzbu a si hotovej. Nette si totiz samo dohleda ze nejaka trida implementuje to rozhrani IAuthenticator a pouzije tu tvoji.

Díky moc za helpnutí, chápu :)