Problém s dvěma a více Autheticatory
- zis
- Člen | 16
Zdravím,
zajímalo by mě, jak použiji dva Authentikátory. Jeden používám na web a druhý chci pro administraci. Způsob přihlášení je u obou odlišný, proto potřebuju mít dva.
Jeden z webu mám nastaven v configu jako službu authenticator. Druhý nemám ale myslel jsem, že jej předám jako instanci z daného presenteru:
public function signInAdminFormSubmitted($form)
{
try
{
$values = $form->getValues();
$this->getUser()->setAuthenticator(new AdminAuthenticator($users));
$this->getUser()->login($values->login, $values->password);
...
Bohužel to nezná tu pruměnou users. Lze to vyřešit nějak elegantně, kdy se pro přihlašování na webu bude používat WebAuthenticator a pro administraci AdminAuthenticator?
Díky za rady.
- Jirda
- Člen | 103
Mozna ti pomuze tohle: https://github.com/…ette20login/
Jedna se o ukazku toho, jak se v nette prihlasovat treba pres FB nebo TW. O to ale nejde, dulezite je, ze zde najdes ukazku vice authentifikatoru. Podle me ti to bude stacit k dostatecne inspiraci k tomu, abys udelal to, co popisujes.
- JakubTN
- Bronze Partner | 49
Ako radi @duke, obidva autheticatory musis mat zaregistrovane v confing.neon
services:
adminauthenticator: AdminAuthenticator( @adminusers )
webauthenticator: WebAuthenticator( @webusers )
A potom v presenteri, kde vykonavas prihlasovanie zavolas ten autheticator, do ktorej casti sa prihlasujes:
try {
$values = $form->getValues();
$user = $this->getUser();
$user->setAuthenticator($this->context->getService('webauthenticator'));
$user->getStorage()->setNamespace('Web');
$user->login($values->email, $values->password);
$this->flashMessage('Prihlásenie prebehlo úspešne.', 'ok');
$this->redirect('Homepage:');
} catch (NS\AuthenticationException $e) {
$this->flashMessage('Neplatné prihlasovacie údaje!', 'error');
}
Editoval JakubTN (28. 9. 2012 17:32)
- zis
- Člen | 16
Jop,
díky všem, vypadá že to funguje. Ještě se to divně chová, když použiju to storage-setNamespace ($user->getStorage()->setNamespace(‚Web‘);). Když pak v latte pouzivam $user->isLoggedIn() tak je false, ale authenticator vrací true, jako že ověřil identitu. Podle mě špatně přistupuju k tomu UserStorage. Moc sem o tom nic neviděl. Nemohl byste někdo napsat jednoduchý příklad na to, jak ověřím, že je user zalogován v daném UserStorage/namespace.
Díkes
- duke
- Člen | 650
Toto je v pořádku:
$user = $this->getUser();
$user->getStorage()->setNamespace('Web');
Jen to musíš volat vždy, a ne jen při přihlášení. Vhodné místo je
startup metoda base presenteru daného modulu, např.
WebModule\BasePresenter::startup
, tj.:
namespace WebModule;
abstract class BasePresenter extends \BasePresenter
{
protected function startup()
{
parent::startup();
$user = $this->getUser();
$user->getStorage()->setNamespace('Web');
}
...
Editoval duke (29. 9. 2012 10:23)
- Felix
- Nette Core | 1247
Take bych ocenil vice authenticatoru. Nyni jsem to vyresil tak, ze mam
$onLogin
v BasePresenteru a pak delam neco jako.
public function startup() {
parent:startup();
$this->onLogin[] = callback($this->user, 'login');
$this->onLogin[] = callback($this, 'myLoginAdapter');
}
Treba to nekomu pomuze.