Nette\Web\User – rozne Identity pre rozne casti aplikacie

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

Potreboval by som pracovat s dvoma rozdielnymi objektami Identity pre 2 rozdielne moduly aplikacie. Vychadzam z rozdielnych BasePresenterov pre kazdy modul, v kazdej potrebujem zvlast autorizaciu a zvlast Identity.

Nastavil som vsetko pre jeden modul, a neprichadzam zatial nato, ako to nastavit pre druhy modul:

Environment::getServiceLocator()->addService( new Frontend_Uzivatel, 'Nette\Security\IAuthenticator');

Stale mi $user = Environment::getUser(); v druhom module nacita prvu Identitu, nech ju inicializujem akokolvek.

phx
Člen | 651
+
0
-

Nestacilo by toto nastaveni delat v onech ruznych BasePresenterech? Pokazde jine nastaveni (to co zrovna pro danou cast potrebujes). Zkusil bych konctruktor nebo startup().

edke
Člen | 198
+
0
-

phx wrote:

Nestacilo by toto nastaveni delat v onech ruznych BasePresenterech? Pokazde jine nastaveni (to co zrovna pro danou cast potrebujes). Zkusil bych konctruktor nebo startup().

Ved tam to prave robim. A v startup(). Napriek tomu, ze nastavenie handlera je v kazdom Presenteri ine, $user = Environment::getUser() vzdy nacita rovnaku identitu. Tusim to bude tym, ze stale je v objekte rovnaky nazov pre cookie.

phx
Člen | 651
+
0
-

Ty chces 2 ruzna soubezna prihlaseni? Nebo si to pamatuje prvni prihlaseni i po odhlaseni?

edke
Člen | 198
+
0
-

phx wrote:

Ty chces 2 ruzna soubezna prihlaseni?

ano

phx
Člen | 651
+
0
-

Tak to bude asi na Davida. Problem je asi zde:
https://api.nette.org/…ser.php.html
Nepodporuje to 2 ruzne prihlaseni s jednim prohlizecem.

David Grudl
Nette Core | 8147
+
0
-

Dvě různá přihlášení zároveň v jednom okně? K čemu by to bylo dobré? Nemyslím, že bych něco takového implementoval.

edke
Člen | 198
+
0
-

David Grudl wrote:

Dvě různá přihlášení zároveň v jednom okně? K čemu by to bylo dobré? Nemyslím, že bych něco takového implementoval.

Rozmyslal som nad strukturou webu, a zapacila sa mi myslienka mat v ramci jedneho projektu backend a frontend spolocne. Lenze pre kazdy chcem samozrejme vlastnu autorizaciu, aj jeden aj druhy modul maju rozdielne informacie o uzivateloch, v rozdielnych sql tabulkach s rozdielnou strukturou.

David Grudl
Nette Core | 8147
+
0
-

Tedy nejde o dvě přihlášení v jednom okně, ale o dva autentizační objekty v jednom projektu. To je jiná.

Pokud bude mít frontend a backed svoji „škatulku“ v config.ini, můžeš autentizační handlery nastavit přímo tam, jinak použij jako píšeš Environment::getServiceLocator()....

Druhá věc je zajistit oddělení session a cookies. To lze buď řešit přes adresáře (nastavit proměnné cookie-path, aby se pro každý adresář používali jiné cookies, takže každý by měl vlastní session & autentizační cookie).

Nebo každé dopřát v rámci jedné session oddělený prostor. To znamená upravit třídu User tak, aby název prostoru byl volitelný. Upravím to.

edke
Člen | 198
+
0
-

David Grudl wrote:

Tedy nejde o dvě přihlášení v jednom okně, ale o dva autentizační objekty v jednom projektu. To je jiná.

Pokud bude mít frontend a backed svoji „škatulku“ v config.ini, můžeš autentizační handlery nastavit přímo tam, jinak použij jako píšeš Environment::getServiceLocator()....

Druhá věc je zajistit oddělení session a cookies. To lze buď řešit přes adresáře (nastavit proměnné cookie-path, aby se pro každý adresář používali jiné cookies, takže každý by měl vlastní session & autentizační cookie).

Nebo každé dopřát v rámci jedné session oddělený prostor. To znamená upravit třídu User tak, aby název prostoru byl volitelný. Upravím to.

Presne tak, ja som to vravel od zaciatku, mam 2 moduly, v kazdom zvlast inicializujem handler, kazdy handler je platny len pre dany modul. Su to teda 2 cookies s roznymi nazvami. Neviem ako by to mohlo byt s tou cestou, ale to limitovanie na cestu moze byt problem.

David Grudl
Nette Core | 8147
+
0
-

Zkus tento patch. Měl by umožnit přepínání jmenných prostorů. Zatím to nelze konfigurovat přes config.ini, takže v bootstrapu zavolej $user->setNamespace('front'); // nebo 'admin'

edke
Člen | 198
+
0
-

David Grudl wrote:

Zkus tento patch. Měl by umožnit přepínání jmenných prostorů. Zatím to nelze konfigurovat přes config.ini, takže v bootstrapu zavolej $user->setNamespace('front'); // nebo 'admin'

Hmm, v bootstrape ? Myslel som ze ten namespace by bolo dobre definovat v BasePresenteri:

abstract class BasePresenter extends /*Nette\Application\*/Presenter
{
	public function startup()
	{


		Environment::getServiceLocator()->addService( new AclFrontend, 'Nette\Security\IAuthorizator' );
		Environment::getServiceLocator()->addService( new Frontend_Uzivatel, 'Nette\Security\IAuthenticator' );
	}
}

Ako v bootstrape rozlisim, ci ide o request do adminu ci frontu ? A este ako by mala potom vyzerat inicializacia $user ?

David Grudl
Nette Core | 8147
+
0
-

Samozřejmě to nemusí být v bootstrapu, klidně v presenteru.

edke
Člen | 198
+
0
-

JOj, somar som. Ako som to skusal prvy krat, nenastavil som namespace v Presenteri Auth, ktory nevychadzal z BasePresenter a len tam som nastavoval namespace. Preto iny namespace a preto sa mi ani nepodarilo prihlasit :)

Otestovane a funguje to ! Admin:

object(User)[54]
  public 'guestRole' => string 'guest' (length=5)
  public 'authenticatedRole' => string 'authenticated' (length=13)
  private 'authenticationHandler' => null
  private 'authorizationHandler' => null
  private 'namespace' => string 'admin' (length=5)
  private 'session' =>
    object(SessionNamespace)[59]
      private 'data' => &
        array
          'identity' =>
            object(Identity)[58]
              ...
          'authenticated' => boolean true
          'authkey' => string 'l4b7pz6hcqcjcwg04sw8s8g8' (length=24)
      private 'meta' => &null
      public 'warnOnUndefined' => boolean false

object(Identity)[58]
  private 'name' => string 'edke' (length=4)
  private 'roles' =>
    array
      0 => string 'administrator' (length=13)
  private 'data' =>
    array
      'id' => string '1' (length=1)
      'id_rola' => string '3' (length=1)
      'login' => string 'edke' (length=4)
      'meno' => string 'Eduard' (length=6)
      'priezvisko' => string 'Kracmar' (length=7)
      'aktivne' => string 't' (length=1)

a vo front casti, kde nie som este len ako guest:

object(User)[29]
  public 'guestRole' => string 'guest' (length=5)
  public 'authenticatedRole' => string 'authenticated' (length=13)
  private 'authenticationHandler' => null
  private 'authorizationHandler' => null
  private 'namespace' => string 'front' (length=5)
  private 'session' => null

null