MultiAuthenticator (jednotné API pro více přihlašovacích metod)
- Vojtěch Dobeš
- Gold Partner | 1316
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)
- Richard Faila
- Člen | 40
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
@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
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
@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
@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