Jak nastavit do configu vlastní autentikátor jinak než celou třídou
- snazimse
- Člen | 43
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 :)
- snazimse
- Člen | 43
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?
- CZechBoY
- Člen | 3608
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
Š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 metoduauthenticate
, 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 :)