Uzivatel s viacerymi rolami

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

Zdravim,
mam otazku ohladne roli vramci Nette\Security\User triedy.
Zoberme situaciu z airbnb.com – kde moze user vystupovat v 2 polohach, pre jasnost nazvov sk/en ich volajme – „prenajimatel“ a „cestovatel“. Clovek teda moze standardne mat schopnost mat obe role, ale na webe vzdy vystupuje iba v jednej. Bud hladam byt na cestovanie a som v roli „cestovatel“, alebo mi napisal zaujemca o mnou prenajimany byt a ja odpisujem ako „prenajimatel“. Moja otazka je: pouzili by ste triedu Nette\Security\User a do identity by ste vlozili vzdy iba jednu rolu – tu v ktorej prave vystupujem, alebo by ste povedali, ze identita moze mat obe role?
Ako by ste potom pracovali s tym, aku verziu stranky zobrazit – ci tu pre „cestovatelov“, alebo tu pre „prenajimatelov“?

hitzoR
Člen | 51
+
0
-

Tohle bych nejspíš řešil spíš na úrovni modulů, než na úrovni identity.

Michal Hlávka
Člen | 190
+
0
-

Roli v indetite bych udelal unikatni tak, aby system vedel, ze je bud cestoval, nebo pronajimatel a nebo oboji. Ve vysledku by to byla jedna role a roli menil jenom tehdy, pokud by uz nechtel byt pronajimatel / cestoval a nebo jednim z toho se chtel prave stat.

Ku prikladu

1 – pronajimatel
2 – cestovatel
3 – cestovatel a pronajimatel

Co by si chtel pak zobrazit, bych uz nechal na UI. Stejne jako uzivateli nabidnes anglickou mutaci a muze si prepnout do ceske.

Oli
Člen | 1215
+
0
-

To záleží asi na use case. Ale uměl bych si to představit jako, že to bude jedna role user. Uživatel cestovatel může zobrazit všechny nabídky, přihlásit se k ním, dávat recenze, … Jediná výjimka je, pokud ta nabídka je jeho.

Naopak, pokud je nabídka jeho, tak ji může editovat, smazat, … ale nemůže ji hodnotit a přihlásit se k ní.

Druhá možnost by byla mít ty role rozdělené cestovatel|pronajimatel a přepínat mezi tím. Ale první varianta mě přijde jednodušší :)

CZechBoY
Člen | 3608
+
0
-

Je vůbec potřeba role pronajímatel? Já bych si zkontroloval jestli u toho daného inzerátu jsem na seznamu pronajímatelů a pokud jo tak jsem teda aktuálně pronajímatel a zobrazit pohled pronajímatele.

tomolas
Člen | 66
+
0
-

hitzoR napsal(a):

Tohle bych nejspíš řešil spíš na úrovni modulů, než na úrovni identity.

Dakujem, to je dobra poznamka. Chapem to spravne tak, ze by tvoj Nette\Security\User mal po prihlaseni iba 1 rolu (i ked ta osoba uz minulosti bola aj „cestovatel“ aj „prenajimatel“) a podla tej by si zvolil module ktory zobrazit?

Editoval tomolas (29. 9. 2016 15:26)

tomolas
Člen | 66
+
0
-

emptywall napsal(a):

Roli v indetite bych udelal unikatni tak, aby system vedel, ze je bud cestoval, nebo pronajimatel a nebo oboji. Ve vysledku by to byla jedna role a roli menil jenom tehdy, pokud by uz nechtel byt pronajimatel / cestoval a nebo jednim z toho se chtel prave stat.

Ku prikladu

1 – pronajimatel
2 – cestovatel
3 – cestovatel a pronajimatel

Co by si chtel pak zobrazit, bych uz nechal na UI. Stejne jako uzivateli nabidnes anglickou mutaci a muze si prepnout do ceske.

Problem je, co by si zobrazil uzivatelovi v roli „cestovatel a prenajimatel“? Priklad.. jeho „dashboard prenajimatela“, alebo „vyhladavanie bytov pre cestovatela“?

Pavel Kravčík
Člen | 1180
+
+2
-

My máme všechny role v identitě. Pokud se nějak překrývají, řeší si to konkrétní část aplikace sama. Není to zodpovědnost identity. Ale my těch rolí máme asi 30. :)

Můžeš si tam udělat nějaké malé rozšíření, třeba tlačítko „chovej se ke mně jako k majiteli“. A v identitě mít jen preferableRole = owner.

hitzoR
Člen | 51
+
0
-

tomolas napsal(a):

hitzoR napsal(a):

Tohle bych nejspíš řešil spíš na úrovni modulů, než na úrovni identity.

Dakujem, to je dobra poznamka. Chapem to spravne tak, ze by tvoj Nette\Security\User mal po prihlaseni iba 1 rolu (i ked ta osoba uz minulosti bola aj „cestovatel“ aj „prenajimatel“) a podla tej by si zvolil module ktory zobrazit?

Ne, roli bych v tomhle případě vůbec neřešil a měl ji prostě jako user/registered/cokoliv. Pokud tam není nějaká složitější aplikační logika nebo složitější ACL, tak bych prostě jen zjistil z databáze, do kterých modulů má přístup a na ty mu zobrazil nějaký přepínač a samozřejmě v BasePresenterech těch modulů kontroloval, jestli tam má přístup.

Samozřejmě tohle za předpokladu, že by byla jedna konkrétní sekce pro cestovatele, kde by každý cestovatel mohl dělat cokoliv (nebylo by víc druhů cestovatelů, každý s jinýma právama) a stejně to bylo i u pronajímatelů. Případně by se dal použít i přístup od @emptywall.

tomolas
Člen | 66
+
0
-

Pavel Kravčík napsal(a):

My máme všechny role v identitě. Pokud se nějak překrývají, řeší si to konkrétní část aplikace sama. Není to zodpovědnost identity. Ale my těch rolí máme asi 30. :)

Můžeš si tam udělat nějaké malé rozšíření, třeba tlačítko „chovej se ke mně jako k majiteli“. A v identitě mít jen preferableRole = owner.

Je to u vas tak, ze sa jednotlive role skor skladaju a doplnuju?
Co by sa stalo tvojim pristupom v danom priklade pre airbnb?
Spravalo by sa to takto?

<?php
	/** @var $user Nette\Security\User() */
	...

	$is_host = $user->isInRole('host'); // true?
	$is_traveler = $user->isInRole('traveler'); // also true?
?>

Nie je to pre tento use-case divne? Nie je v tvojom pripade isInRole() skor odpoved na otazku canBeInRole()?
Chapem, ze pre iny priklad roli typu: discussion_moderator + blog_author je to v pohode.

Pavel Kravčík
Člen | 1180
+
0
-

Prolínají se, doplňují a také spolu nesouvisí. Vypadá to přibližně takto:

User - roles (psa.admin, bill, money, stats) // Uživatel má seznam rolí ve kterých figuruje

Bill - (BillImport, BillStats) // Každá role má seznam presenterů a akcí
Money - (BillImport:stats) // Některé mají třeba jen jednu stránku, zapsané je to hezky v neon, tohle je příklad

Role se mohou překrývat, například admin vidí jak import, tak statistiky, ale člověk se statistikami nevidí import a podobně. Při přihlášení se všechny ty věci vezmou a zmergujou. Výsledek je čistý seznam, kam daný uživatel může. Tam se řeší překrývání a podobně.

Pak se kontroluje, jestli má uživatel přístup na danou stránku a to je v podstatě celé. IsInRole používáme minimálně. Je to strašně kostrbaté.

Spíš bychom to řešili následovně, v nastavení modulu si definuju akce (owner, buyer) a v kódu by bylo asi něco podobného:

	$control = $this->Ifactory->create($user);
	return $control;

	//V komponentě by asi něco jako:

	if($user->isAllowed(buyer) && $u->isA(owner))
	{
		if($user->preferable == self::BUYER)
		{
			$this->state = 'buyerList';
		}
		else
		{
			$this->state = 'ownerOverview';
		}
	}
	... další podmínky

Nechali bychom mu možnost volby, ale spíš by k tomu nikdy nedošlo, abychom se nedokázali rozhodnout, co je prioritnější. Spíš by to byly dvě samostatné části. Řešit by to bylo potřeba akorát po přihlášení myslím.

tomolas
Člen | 66
+
0
-

Dakujem za vsetky odpovede!