Jak získat identitu jiného namespace?

Infanticide0
Člen | 57
+
0
-

Ahoj, na webu mám více druhů účtů, podle dokumentace můžu být přihlášen jako administrátor i jako klient zároveň, to funguje. V dokumentaci už se ale nepíše, jakým způsobem zjistím, jestli jsem přihlášený i jako administrátor (v cizím namespace), když jsem v presenteru Front modulu (kde je session namespace client).

Např. když jsem na stránce PagePresenteru (client namespace) a vím, že jsem přihlášený admin (cizí namespace), můžu zobrazit ovladače pro rychlý edit stránky.

Mám pro tohle zjištění metodu, která nějak funguje:

  1. přepne na namespace
  2. získá jeho identitu
  3. přepne zpátky na původní namespace
  4. vrátí identitu

Není v Nette lepší řešení?

	$this->getUser()->getStorage()->setNamespace($namespace);
	$this->getUser()->refreshStorage();
	$identity = $this->getUser()->getIdentity();
Marek Bartoš
Nette Blogger | 1146
+
0
-

Můžeš mít dvě oddělené služby User, každou s vlastním storage. A jen si je podědit kvůli autowiringu.

Případně pokud ti stačí podobné řešení k nette/security, tak jsem vytvořil orisai/auth, které toto podporuje by design (též skrze více instancí User – jen se jmenují Firewall)

Infanticide0
Člen | 57
+
0
-

Díky za pomoc, rád bych věděl, jak to funguje uvnitř Nette.

Ty dvě User služby jsou dvě třídy dědící z Nette\Security\User? Vytvořím třídy AdminUser a ClientUser extends Nette\Security\User a zaregistruju jako službu s autowired: self, jak se pak dostane do (base)presenterů těch Modulů – $presenter->getUser()?

orisai/auth vyzkouším, dělá spoustu věcí, které bych asi musel řešit nakonec taky.

Marek Bartoš
Nette Blogger | 1146
+
+3
-

Nette nemá storages napsané tak, aby dokázaly fungovat s více rozdílnými usery, takže máš na výběr buď to přepínání namespaces nebo si pro každého usera zaregistrovat vlastní storage.

Obyčejně jsem to řešil tak, že pro veřejnou část webu zůstal User a jen pro administraci jsem si udělal AdminUser s autowired self a dědící User a předal si AdminUser tam, kde byl třeba, abych měl co nejmenší šanci rozbít kompatibilitu.

Ale mít AdminUser a ClientUser můžeš taky. Tím, že jsou všechny presentery zaregistrované ve službách, tak jim můžeš nastavit jinou službu User. Vypadalo by to zhruba takto:

decorator:
	App\BaseAdminPresenter:
		setup:
			- injectPrimary(user: @App\AdminUser)

Pokud použiješ orisai/auth, tak nezapomeň na integraci orisai/nette-auth. Pro session storage, Tracy panel a registraci závislostí, které by měly být pro všechny appky stejné.