Nette\Web\User – rozne Identity pre rozne casti aplikacie
- edke
- Člen | 198
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.
- edke
- Člen | 198
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
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 | 8218
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
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 | 8218
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
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 | 8218
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
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 ?
- edke
- Člen | 198
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