Přihlašovaní. Nastavení authenticatoru

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

Dobrý den,
prosím vás. V aplikaci která má více modulů, mám v každém modulu jeden Sign presenter a chtěl bych pro každý modul vlastní authenticator.

Po tomto kódu se mi vždy spustí ten základní authenticator ze sandboxu: App\model\UserManager.
Dá se nějak nastavit, který authenticator se má spustit, když jich mám víc?

		$user = $this->getUser();
$user->getStorage()->setNamespace('App\ClientModule');

try {
    $user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
    $form->addError('Nesprávné jméno nebo heslo.');
}

Děkuji.

Editoval Relapse (23. 6. 2015 13:53)

David Matějka
Moderator | 6445
+
+1
-

storage namespace nerozhoduje o tom, ktery authenticator se pouzije. Ten NS pouze slouzi k oddeleni vice identit v ramci jedne aplikace. Pokud mas vic authenticatoru, musis to vyresit sam. Nejaka reseni najdes treba tady: https://forum.nette.org/…administrace

jiri.pudil
Nette Blogger | 1032
+
+2
-

Osobně využívám toho, že do login metody můžeš vrazit přímo identitu, čímž se autentikátor úplně obejde. V autentikátorech pak nemusíš implementovat žádné rozhraní (čímž se vyhneš výjimce „Multiple services of type IAuthenticator found“ a ta autentikační metoda zároveň může transparentně vyjmenovat své skutečné parametry), zaregistruješ si je do kontejneru a vyžádáš si je podle potřeby jako kteroukoliv jinou službu.

$identity = $passwordAuthenticator->authenticate($username, $password);
// nebo třeba $identity = $tokenAuthenticator->authenticate($token);
$this->user->login($identity);
Relapse
Člen | 34
+
0
-

Udělal jsem to podle odkazu od Davida.

SignPresenter:

	/**
 * @inject
 * @var UserManager
 */
public $userManager;

	...

		$user = $this->getUser();
    $user->setAuthenticator($this->userManager);
    $user->getStorage()->setNamespace('App\ClientModule');

    try {
        $this->user->login($values->username, $values->password);
        $this->flashMessage('Přihlášení proběhlo úspěšně');
        $this->redirect('Homepage:default');
    } catch (Nette\Security\AuthenticationException $e) {
        $form->addError('Nesprávné jméno nebo heslo.');
    }

neon:

services:
	- App\Model\UserManager
	router: App\RouterFactory::createRouter

	UserManager:
	    class: App\Model\UserManager
	    autowired: no

BasePresenter:

	public function getUser() {
    $user = parent::getUser();
    $user->getStorage()->setNamespace('App\ClientModule');
    return $user;
}

Přihlášení proběhne úspěšně.

Jen ještě, jak můžu s instancí $user pracovat v šablonách?
Musím pokaždé v render metodě provést něco jako:

$this->template->user = $this->getUser();

Protože, když to neudělám, tak mi

{if $user->loggedIn}

vrátí false.

Editoval Relapse (24. 6. 2015 9:43)

David Matějka
Moderator | 6445
+
0
-

v base presenteru nastav ten namespace ve startup metode, pak nebudes muset prekryvat tu getUser a nic dalsiho posilat do sablony

srigi
Nette Blogger | 558
+
0
-

Najjednoduchie riesenie je ako pise @jiri.pudil. Pekne je to popisane (preco tam?) v doplnkoch

jiri.pudil
Nette Blogger | 1032
+
0
-

@srigi v doplňcích to je kvůli tomu, že to původně doplněk byl, než se @VojtěchDobeš uchýlil k drobné architektonické změně :)

h4kuna
Backer | 740
+
+1
-

Viz post