MultiAuthenticator (jednotné API pro více přihlašovacích metod)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Pokud v aplikaci používáte více přihlašovacích způsobů (každá je implementována jako zvláštní implementace IAuthenticator) a v aplikaci se vám tak motají různé služby, miniaturní MultiAuthenticator vám pomůže trochu uklidit.

Github: https://github.com/…uthenticator

Snadno lze nainstalovat pomocí Composeru:

vojtech-dobes/nette-multi-authenticator

Zaregistrovat jako extension:

$configurator->onCompile[] = function ($configurator, $compiler) {
	$compiler->addExtension('authentication', new VojtechDobes\MultiAuthenticatorExtension);
};

A nastavit přihlašovací způsoby (které mohou být buď implementace IAuthenticator nebo i obyč. callbacky, viz stránka addonu):

authentication:
	db: DatabaseAuthenticator( @dibi )
	twitter: TwitterAuthenticator( )
	facebook: @facebookAuthenticator

A použití?

$user->login('db', 'marek', ***);

Editoval vojtech.dobes (9. 11. 2012 10:22)

LeonardoCA
Člen | 296
+
0
-

Super, časem využiju.

Richard Faila
Člen | 40
+
0
-

Zdravím

Stáhnul jsem si soubory z GitHubu, nakopíroval je do libs, zaregistroval jsem rozšíření v bootstap.php přesně tak jak je uvedeno výše.

config.neon

<?php
services:
        database: @nette.database.default
        #authenticator: Authenticator(@database)

authentication:
        db: Authenticator(@database)
        token: TokenAuthenticator(@database)
?>

Jenže při volání $this->getUser()->login('db',$username, $password); nebo $this->getUser()->login('token', $token); mi Laděnka vyhodí chybu Nette\DI\MissingServiceException s tím že : Multiple services of type Nette\Security\IAuthenticator found.

Standardní věci typu smazaní cache jsem zkoušel a teď opravdu netuším, kde by mohla být chyba.

PHP 5.3, Apache Windows, Nette 2.1-dev

akadlec
Člen | 1326
+
0
-

@vojtech.dobes taky jsem zkusil tvůj doplněk a nechce se mu běhat. Problém stejný jako výše kolega. Při pokusu o autentizaci vyhodí laděnka chybu:

Nette\DI\MissingServiceException
Multiple services of type Nette\Security\IAuthenticator found.

Vyhodí to v okamžiku kdy se nette pokouší získat authenticator:

final public function getAuthenticator()
{
	return $this->authenticator ?: $this->context->getByType('Nette\Security\IAuthenticator');
}

V appce mám dvě třídy(služby) co mají implementováno Nette\Security\IAuthenticator, ten tvůj MultiAuthenticator a pak klasický systémový Authenticator

Rozšíření mám zaregistrované normálně v bootstrapu jak uvádíš v návodu, pak v neonu patřičnou sekci:

authentication:
	system: @authentication.system
	twitter: @authentication.twitter

Taky jedu na: PHP 5.3, Apache Windows, Nette 2.1-dev.

Co by mohlo být špatně?

davidm
Člen | 81
+
0
-

nastav vsem authenticatorum, krome MultiAuthenticatoru, autowired: no

Pokud chces pouzivat autowire musis mit vzdy jen jednu tridu ktera implementuje dane rozhrani. Kdyz jich mas vic tak ji musis takto urcit. Např.:

passwordAuthenticator:
    class: App\Security\PasswordAuthenticator
    autowired: no
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

@akadlec, Přesně jak píše @davidm, tam, kde máš definovaný ten system a twitter autentikátor, doplň jim autowired: no.

@Richard Faila V tomto případě je možné, že tam mám někde chybu, ověřím to. Poněvadž autentikátory přímo definované v sekci rozšíření by měly být neautowirovány automaticky. Vypadá to, že jsem to zapomněl doimplementovat :).

Majkl578
Moderator | 1364
+
0
-

@akadlec, Richard Faila: Setkal jsem se dnes s tímtéž. Další možné řešení je neduplikovat služby (tak jak to dělá @akadlec), ale přímo definovat služby v sekci autentikátoru explicitně, tedy takto:

authentication:
	"frontend":
		class: App\Security\Authenticators\FrontendAuthenticator
		autowired: no
	"backend":
		class: App\Security\Authenticators\BackendAuthenticator
		autowired: no
akadlec
Člen | 1326
+
0
-

Majkl578 no původně jsem to měl definované i takto pomocí jednotlivých tříd, nicméně bez toho příznaku autowired, zkusim a snad to pošlape.

akadlec
Člen | 1326
+
0
-

takže autowired: no vyřešilo problém a multiauthenticator funguje tak jak má. Díky chlapi ;)