Problém s dvěma a více Autheticatory

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

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
+
0
-

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.

duke
Člen | 650
+
0
-

@zis Tak, jak to děláš ty, to půjde taky. Jen si ten AdminAuthenticator zaregistruj v configu jako službu a injectni si ho do presenteru (nebo alternativně si ho vytáhni v presenteru přes $this->context). To tvé $users by nejspíš také měla být služba zaregistrovaná v configu.

JakubTN
Bronze Partner | 49
+
0
-

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
+
0
-

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
+
0
-

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)

jtousek
Člen | 951
+
0
-

Osobně považuji za vhodnější mít jen jeden authenticator a vše ostatní řešit pomocí rolí a autorizace.

Nox
Člen | 378
+
0
-

No pokud máš 2 různé způsoby přihlašování, tak jeden authenticator nejspíš nepostačí. Pokud nebereme jako chybu mít víc způsobů authentikování (nemyslim, že je to špatně), tak nevidim problém.

Jirda
Člen | 103
+
0
-

Vice authentifikatoru mi prijde taky jako lepsi zpusob. Navic to nicemu snad neskodi.

Felix
Nette Core | 1190
+
0
-

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.