Uzivatel s viacerymi rolami
- tomolas
- Člen | 66
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“?
- Michal Hlávka
- Člen | 190
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
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šší :)
- tomolas
- Člen | 66
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
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 pronajimatelCo 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 | 1195
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
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
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 | 1195
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.