Více nezávislých přihlášení v aplikaci

vlkodlak
Člen | 160
+
0
-

zdravím, Panové, prosím o osvětu. našel jsem v dokumentaci, že v jednom projektu mohu se přihlásit vice krát viz.: https://doc.nette.org/…thentication#… (dodnes jsem využíval jen jedno uživatelské prostředí a když jsem potřeboval využit funkce například jiného uživatele buď jsem použil jiný prohlížeč nebo odhlásil a přihlásil pod jiným loginem). Můj myšlenkový pochod kazi tento příklad https://doc.nette.org/…thentication#…

services:
-
factory: FrontAuthenticator
 autowired: self

znamená to že nemohou přihlásit dva „rovnocenný“ uživatele a musí byt jeden obyčejný návštěvník a druhy například administrátor? a pak bych měl vytvořit něco jako

services:
-
factory: FrontAuthenticator
factory: AdminAuthenticator
 autowired: self

a navazující otázka jak pak mohu odhlásit jednoho konkretního uživatele? resp. jak se mi změní práce s tím jedním konkretním uživatelem … doplněním nasledovaných určujících příkazu?

.... ->getStorage()->setNamespace('backend');

vladimir.biro
Člen | 163
+
0
-

Ahoj. Prihlasenie viacerych uzivatelov je napriklad na to, ked ma web napriklad uzivatelske prihlasenie na stranke a prihlasenie administratora do backendu na spravu webu. Vtedy mozes byt prihlaseny ako admin webu aj ako uzivatel. No nemozes byt prihlaseny ao dvaja uzivatelia alebo ako dvaja administratori stranky. Su to dva oddelene svety.

Keby si bol prihlaseny ako dvaja uzivatelia, ako by system vedel, za ktoreho vykonavas upravy, ci pridavas clanok, alebo cokolvek ine?

Rozdelenie napriklad backendu a frontendu sa robi tak, ze do BasePresenteru frontentu si napises:
$this->getUser()->getStorage()->setNamespace(‚frontend‘);

a do BasePresenteru backendu
$this->getUser()->getStorage()->setNamespace(‚backend‘);

vlkodlak
Člen | 160
+
0
-
Rozdelenie napriklad backendu a frontendu sa robi tak, ze do BasePresenteru frontentu si napises:
$this->getUser()->getStorage()->setNamespace(‚frontend‘);

a do BasePresenteru backendu
$this->getUser()->getStorage()->setNamespace(‚backend‘);

aha, tak že pokud chci přihlasit „rovnocené“ uživatele např. ze skupiny user to nejde, ale pokud chci dva ruzné typy např. uživatel a admin to lze. a příkazy použivam standartně jen na začatku definují setNamespace s kterým chci pracovat.

no a co mi bráni pamatovat např. ID uživatele a odvolat se např. $this->getUser()->getStorage()->setNamespace("<ID_User>"); ??? s tím, že pak jedné co musím předávat mezi stránkami jen to ID uživatele, protože vše ostatní bude schovano v tom session

CZechBoY
Člen | 3608
+
0
-

Proč prostě nepoužít anonymní okno? Prohlížeč stejně posílá furt stejnou session pro všechny panely jedný instance prohlížeče… takže nemáš jak je od sebe oddělit.

vlkodlak
Člen | 160
+
0
-

CZechBoY: jde mi o to, abych mohl použit v jednom prohlížeči dvě/tři různé přihlášení v samostatných oknech od stejného prohlížeče. Teď v momentě, když používám standardní postup z Nette. Tak mám uživatele, který je stále přihlášen ať dělám co dělám. A abych mohl přihlásit s jiným uživatelem tak musím prvního odhlásit.

Možné řešení (byť „pracné“ a asi neúplně košer) je mít vygenerovány „klič“ / unikátní řetězec, který budu předávat na stránkách tj. co uživatel to samostatný klič. dle klíče vím, že uživatel je registrovaný, dle uživatele vím co smí dělat atd.

CZechBoY
Člen | 3608
+
0
-

jo, url je jediná věc co nemaj taby společný.

vladimir.biro
Člen | 163
+
0
-

vlkodlak napsal(a):

Rozdelenie napriklad backendu a frontendu sa robi tak, ze do BasePresenteru frontentu si napises:
$this->getUser()->getStorage()->setNamespace(‚frontend‘);

a do BasePresenteru backendu
$this->getUser()->getStorage()->setNamespace(‚backend‘);

aha, tak že pokud chci přihlasit „rovnocené“ uživatele např. ze skupiny user to nejde, ale pokud chci dva ruzné typy např. uživatel a admin to lze. a příkazy použivam standartně jen na začatku definují setNamespace s kterým chci pracovat.

no a co mi bráni pamatovat např. ID uživatele a odvolat se např. $this->getUser()->getStorage()->setNamespace("<ID_User>"); ??? s tím, že pak jedné co musím předávat mezi stránkami jen to ID uživatele, protože vše ostatní bude schovano v tom session

Namespace musis definovat este pred prihlasenim. A keby si nasledne zmenil namespace, tak ti prdne to povodne prihlasenie. (alebo by sa nestalo nic? … neviem, nemam to odskusane, ale myslim, ze to co od toho chces, by sa nestalo :) ) Namespace sa ti nastavuje na aplikaciu ako taku, nie na vystup v okne, alebo tabe prehliadaca.

Editoval vladimir.biro (14. 11. 2017 22:38)

vlkodlak
Člen | 160
+
0
-

Vladimir.biro
tak, že vícero úrovňové přihlašovaní není jako baliček typu, kdy sice session odesilan jako celek, ale v konkretním okně si mohu vybrat s kterou hodnotou chci pracovat.

session --- uzivatel1 --- hodmota1
                      --- hodnota2

        --- uzivatel2 --- hodnota1
                      --- hodnota2
vladimir.biro
Člen | 163
+
+1
-

vlkodlak napsal(a):

Vladimir.biro
tak, že vícero úrovňové přihlašovaní není jako baliček typu, kdy sice session odesilan jako celek, ale v konkretním okně si mohu vybrat s kterou hodnotou chci pracovat.

session --- uzivatel1 --- hodmota1
                      --- hodnota2

        --- uzivatel2 --- hodnota1
                      --- hodnota2

Idelane, ked si precitas toto: https://doc.nette.org/…thentication#…

Je tam na par riadkoch pekne vysvetlena cela problematika.

vlkodlak
Člen | 160
+
0
-

vladimir.biro
je to bod odkud jsem vyšel viz. můj první příspevek a asi budu muset prostě zkusit svou verzi s předávanim ID uživatele, kdy místo pojmenovaní ‚backend‘ nebo ‚fronend‘ určím uživatelské hodnoty pomoci jeho unikátního ID a tak by nemuselo vadit ani to že jeden uživatel dostane session ostatních uživatelů, protože bezpečnost bude ošetřeny/zajištěna tím, že uživatel sedí u jednoho pc tj má přístup ke všem přihlášeným účtům

public function checkRequirements($element, $IDUser)
{
    $this->getUser()->getStorage()->setNamespace( $IDUser );
    parent::checkRequirements($element);
}
vladimir.biro
Člen | 163
+
0
-

vlkodlak napsal(a):

vladimir.biro
je to bod odkud jsem vyšel viz. můj první příspevek a asi budu muset prostě zkusit svou verzi s předávanim ID uživatele, kdy místo pojmenovaní ‚backend‘ nebo ‚fronend‘ určím uživatelské hodnoty pomoci jeho unikátního ID a tak by nemuselo vadit ani to že jeden uživatel dostane session ostatních uživatelů, protože bezpečnost bude ošetřeny/zajištěna tím, že uživatel sedí u jednoho pc tj má přístup ke všem přihlášeným účtům

public function checkRequirements($element, $IDUser)
{
    $this->getUser()->getStorage()->setNamespace( $IDUser );
    parent::checkRequirements($element);
}

Ten namespace musis mat definovany skor, ako prihlasis uzivatela, cize skor, ako budes poznat $IDUser prihlaseneho uzivatela.

CZechBoY
Člen | 3608
+
0
-

Ale ty nevis jakyho uzivafele prihlasujes… vsechny taby maji stejne cookies. Rozdilna je jen url.

vlkodlak
Člen | 160
+
0
-

CZechBoY, Vladimir.biro

dobře a co tento scenář:

  • uživatel otevírat prohlížeč a otevírá mou web stránku
  • vygeneruji unikátní klič (UK) platný pro tohoto konkretního uživatele do doby než zavře toto jediné okno
  • založím setNamespace s tímto UK a aniž by byl přihlášený uživatel. Později po přihlášení spojím setNamespace a login uživatele
  • v pozadí předávám toto UK mezi stránkami a tak mám přístup do session k danému uživateli a standardním funkcím pro Nette

… teď přemýšlím zda to nemám zbytečně překombinované a zda by se dalo to vyřešit jednodušeji, protože pokud už si budu pamatovat UK tak mi nic nebrání vše řešit ve vlastni režii přes databázi. Jedině to, že se ochudím o použíti standardní funkci Nette

Editoval vlkodlak (15. 11. 2017 22:28)

vlkodlak
Člen | 160
+
0
-

CZechBoY

s tím URL to nezavrhují jen potřebují tu session schovat z adresy asi do stránky asi přes <input … hidden>

Editoval vlkodlak (15. 11. 2017 22:31)

vladimir.biro
Člen | 163
+
0
-

vlkodlak napsal(a):

CZechBoY, Vladimir.biro

dobře a co tento scenář:

  • uživatel otevírat prohlížeč a otevírá mou web stránku
  • vygeneruji unikátní klič (UK) platný pro tohoto konkretního uživatele do doby než zavře toto jediné okno
  • založím setNamespace s tímto UK a aniž by byl přihlášený uživatel. Později po přihlášení spojím setNamespace a login uživatele
  • v pozadí předávám toto UK mezi stránkami a tak mám přístup do session k danému uživateli a standardním funkcím pro Nette

… teď přemýšlím zda to nemám zbytečně překombinované a zda by se dalo to vyřešit jednodušeji, protože pokud už si budu pamatovat UK tak mi nic nebrání vše řešit ve vlastni režii přes databázi. Jedině to, že se ochudím o použíti standardní funkci Nette

Myslim, ze akonahle otvoris druhe okno/tab s tvojou strankou, vygenerujes univerzalny kluc, zalozis setNamespace, tak tym prepises automaticky setNamespace aj prveho okna/tabu. To setNamespace je vlastne vec session a ta je viazana ja zakladnu url.

vladimir.biro
Člen | 163
+
0
-

Ale ok, podme premyslat nad tym, ako sa nieco da, nie furt ako sa neda :)

Takze. Ked chces byt na jednom PC prihlaseny ako dvaja rozni uzivatelia, tak potrebujes nejaky identifikator, ktory sa bude prenasat inac ako cookies. Cize uz nam ostava asi jedine URL.

Takze hned po nacitani webu by si mal v BasePresenteri (niekde na zaciatku ziv. cyklu) kontrolovat pritomnost parametra (nazvyme ho napriklad) $uk. Pokila sa tento parameter v premennej nenachadza, vygenerujem si jedinecne $uk a refresnem web s tym, ze tento paramater pridam do URL. Odteraz musim tento parameter prenasat kazdym requestom. Takze by bolo vhodne na to pouzit perzistentnu premennu.

Fajn, teraz uz mas na PC otvorene dva taby a na kazdom prenasas univerzalne $uk a mozeme sa prihlasovat.

Nemozeme.

Musime si najskor vyrobit vlastny authentificator, pretoze ten z nette nam asi nepomoze, nakolko nie je na taketo finty stvoreny :)

Takze si vytvoris authentifikator, ktory umozni prihlasit viac uzivatelov v jednom okne, kazdemu priradit parameter z premennej $uk a potom ich uz len rozlisovat podla toho, ci su tieto dva parametre rovnake.

Ak tak si ale myslim, ze je jednoduchsie otvorit si web v opere, druhy web v chrome a mozes byt prihlaseny kludne ako dvaja uzivatelia nezavisly na sebe. A ak mas aj IE, tak kludne aj traja :D

vlkodlak
Člen | 160
+
0
-

Vladimdir.biro
To ještě nevím, ale má úvaha je založená na předpokladů toho, že pokud mohu mít ‚backend‘ a ‚frontend‘, které se nepřepisují, proč by nemohl existovat jiný unikátní klíč např v mém případě UK a také přeci není nastaveno omezení jen na dva záznamy v session

vladimir.biro
Člen | 163
+
0
-

vlkodlak napsal(a):

Vladimdir.biro
To ještě nevím, ale má úvaha je založená na předpokladů toho, že pokud mohu mít ‚backend‘ a ‚frontend‘, které se nepřepisují, proč by nemohl existovat jiný unikátní klíč např v mém případě UK a také přeci není nastaveno omezení jen na dva záznamy v session

Backend a Frontend su dva oddelene svety. To co chces ty spravit je, aby Backend aj Frontend boli to iste.

Vies si namespace nastavit na konkretny presenter, ale nemozes mat dva namespace na tom istom presenteri.

Povedal by som, ze v tvojom pripade cez namespace cesta nevedie.

vladimir.biro
Člen | 163
+
0
-

Ja osobne sa najlepsie ucim na vlastnych chybach. Vyskusaj si to tak, ako pises a ked pride „Aha efekt“, tak ti to cele zapadne do seba :)

Alebo to spravis a vytries mi tym zrak ;)

vlkodlak
Člen | 160
+
0
-

vladimir.biro napsal(a):


Alebo to spravis a vytries mi tym zrak ;)

no upřimně já to jako soutěž nevnímám, spíše radu od zkušenějších, která mi pomůže „ušetřit drahocenný čas“ experimentováním s neperspektivní větví vývoje. jistě znáš, kdy vytvoříš vizi a jdeš za ní, ale ve 3/4 cesty zjistíš špatnou úvahu hned na začátku a jsi postaven před tvrdou realitu začít zaplátovat a z kódu je paskvil nebo začít znovu. obě varianty jsou časově náročné a v porovnaní s časovou „ztrátou“ při připravě je jedna k milionu a rozhodně: „nebudu učit orly létat“ – nejsem tak silný ve znalostech Nette, abych si to mohl „dovolit“ :)

Editoval vlkodlak (16. 11. 2017 8:37)

CZechBoY
Člen | 3608
+
+1
-

jo, token v url a dynamicky namespace podle tokenu ti dovoli nekolik prihlaseni…

vlkodlak
Člen | 160
+
0
-

CZechBoY
Promiň, teď jsem se ztratil v Tvé stručné odpovědí. Můžeš, prosím, to trošičku rozepsat víc? Rozepsat Tvou myšlenku, děkují

Pavel Kravčík
Člen | 1182
+
+1
-
/administrace/userList?token=OkamuraToken //user1
/administrace/userList?token=ZemanToken //user2

$this->getParameter('token') // select namespace by
vladimir.biro
Člen | 163
+
+1
-

vlkodlak napsal(a):

vladimir.biro napsal(a):


Alebo to spravis a vytries mi tym zrak ;)

no upřimně já to jako soutěž nevnímám, spíše radu od zkušenějších, která mi pomůže „ušetřit drahocenný čas“ experimentováním s neperspektivní větví vývoje. jistě znáš, kdy vytvoříš vizi a jdeš za ní, ale ve 3/4 cesty zjistíš špatnou úvahu hned na začátku a jsi postaven před tvrdou realitu začít zaplátovat a z kódu je paskvil nebo začít znovu. obě varianty jsou časově náročné a v porovnaní s časovou „ztrátou“ při připravě je jedna k milionu a rozhodně: „nebudu učit orly létat“ – nejsem tak silný ve znalostech Nette, abych si to mohl „dovolit“ :)

Nemusis si koli tomu rozhadzat cely web … vytvor si niekde cisty sandbox, alebo proste prazdne nette a tam mozes experimentovat. Ked prides na funkcne riesenie, tak to iste spravit v tvojom projkete.

Niekotre veci clovek musi vyskusat, aby prisiel na suvislosti. To je lepsie, ako akakolvek rada :)

CZechBoY
Člen | 3608
+
+1
-

sry, na mobilu se píše debilně (možná jsem neměl psát vůbec)
v basepresenteru

/** @persistent */
public $userToken;

startup()
{
	if ($ip === 'moje.ip') {
		enableUserOverToken();
	}
}

enableUserOverToken()
{
	if ($this->userToken) {
		$this->user->setNamespace($this->userToken);
	}
}
matopeto
Člen | 395
+
+1
-

Ked sa pozriem ako to ma google (gmail), tak ma v url vzdy u/0/ alebo u/1/ kde to cislo je cislo prihlaseneho usera, proste nieco v url byt musi. Spravil by som to podobne… ale to je mozno nieco ako ten token, co niekto pisal hore.

GEpic
Člen | 562
+
+1
-

Dle mě si chceš ušetřit práci na něčem, co ti akorát přidělá potíže, zabere spoustu času a bude zbytečně smrdět v kódu. To měj radši otevřené dva prohlížeče.

Editoval GEpic (16. 11. 2017 12:01)

vlkodlak
Člen | 160
+
0
-

Pavel Kravčík, vladimir.biro, CZechBoY, matopeto, GEpic
Panové já Vám DĚKUJÍ za vaše podněty a protože řešení není jednoznačné jdu to prostě „ošahat“ na čistém sandboxu … a pokud narazím na svatý Grál podělím se s Vámi :)