Front a Admin authenticator

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

Zdravím, potřeboval bych mít přihlašování pro front a admin modul zvlášť.
Podařilo se mi to tak, že jsem v každém modulu udělal BasePresenter a do metody startup jsem vložil:

$this->getUser()->getStorage()->setNamespace('Module');

Funguje to ale tak, že musím mít uživatele pro Front i Admin v jedné tabulce, což nechci. Napadlo mě tedy udělat druhý authenticator. V config.neon mám

	services:
		authenticator: Authenticator

zkoušel jsem tam přidat druhý, ale nevím, jak ho při přihlašování použít. Lze to nějak jednoduše?
Popřípadě by mi stačilo, aby se původní authenticator, který již funguje použil pro Front modul a pro Admin modul se použilo jen přihlašovací jméno a heslo pevně nastaveno, že by se nemuselo tahat z databáze.

Díky za rady.

Tomáš Kolinger
Člen | 136
+
0
-

Lze to udělat přes jeden (a detekovat zdrojovou tabulku dle aktuálního modulu). NEbo lépe použít rozšíření https://componette.org/search/?… a to ti už umožní mít více authanticatorů, při ->login si dle identifikátoru zvolíš, který chceš použít.

Xantes
Člen | 28
+
0
-

Původně jsem se právě chtěl použití toho addonu vyhnout a jít vlastní cestou. Nakonec jsem ho ale vyzkoušel a zdá se, že funguje dobře. Díky

Chtěl bych se ale zeptat, jak se píše v addonu, že lze zaregistrovat i obyčejný callback, tak jsem to udělal pro admin modul následovně

$container->authenticator->addAuthenticator('authadmin', function ($username, $password) {
	if ($username === 'test' && $password === 'test') {
		return new Nette\Security\Identity('authadmin');
	}
});

Laděnka ale hlásí Missing argument 2 for {closure}(). Neví někdo proč ten callback nefunguje?

Tomáš Kolinger
Člen | 136
+
0
-

Nevím proč to nefunguje ale tomuhle bych se určitě vyhnul. Tohle předpokládám máš v bootstrapu a to je poměrně pěkná prasárna. Lepší je mít normální dva authenticatory, jen je neregistruješ jako službu ale jako parametry toho rozšíření. To je celé… Navíc jak tady získáš přístup do DB? Z $container->getService()? Fuj, fuj…

David Matějka
Moderator | 6445
+
0
-

@Xantes: imho je v doc chyba a tomu callbacku se posila pouze jeden argument s polem jednotlivych argumentu, stejne jako v pripade klasickeho authenticatoru

Xantes
Člen | 28
+
0
-

@Tomáš Kolinger: Vlastně jsem ani do databáze přistupovat nechtěl. Chtěl jsem si jen pro jednoduchost zkusit do administrace přihlašování s pevně nastaveným uživatelským jménem a heslem mimo db, protože správce bude stejně jen jeden. Ideální řešení to ale asi není a nejspíš to stejně udělám s dvěma athenticatory, jak píšeš.

@matej21: Po upravení argumentů funguje. Díky.

petr.pavel
Člen | 535
+
0
-

Jenom pro protokol, bez add-onu to jde jednoduše:

$this->user
  ->setAuthenticator($this->context->adminAuthenticator)
  ->setAuthorizator($this->context->adminAuthorizator)
  ->storage->setNamespace('Admin');
$this->user
  ->setAuthenticator($this->context->playerAuthenticator)
  ->setAuthorizator($this->context->playerAuthorizator)
  ->storage->setNamespace('Player');
Xantes
Člen | 28
+
0
-

@petr.pavel Vyzkouším, díky.