Prava plati za firmu, ne za cloveka
permissionsOf(user) scitalo role pres vsechna clenstvi, takze kdo byl spravce v jedne firme, jednal jako spravce ve vsech, kam patril. Uzivatel ve dvou firmach je vzacny, dusledek ne. - firma je povinny argument u permissionsOf, hasPermission i hasAnyPermission. Zamerne povinny: kdyby byl nepovinny, prvni volani bez nej by tise vratilo vsechna prava. Prekladac tim rovnou nasel vsech ctrnact mist, ktera se ptaji. - kazde misto se pta za tu spravnou firmu: akce nad ticketem za firmu toho ticketu, uprava zaznamu za firmu toho zaznamu, zalozky a helpdesk za firmu, kterou ma clovek prepnutou - cizi firemni role se ignoruje, i kdyby na ni clenstvi odkazovalo. Jinak by stacilo pripsat si ji do clenstvi v jine firme a prava by se prenesla. - cache prav ma v klici firmu - readScope cte z jedne firmy, te prepnute, ne ze vsech. V nastaveni se driv michaly typy ticketu a role napric firmami bez ohledu na vyber. Opraveno u toho: systemove role se pri startu srovnaji s kodem (syncSystemRoles). Vychozi sada se pouzije jen do prazdneho uloziste, takze nove pravo v katalogu se k uz bezici instalaci nikdy nedostalo - ticket.create ani obe prava helpdesku by spravci firmy nenabehla a zalozka Helpdesk by se neobjevila. Meni se jen prava, jen u nasich roli, nazvu se to netyka. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2329ccbdc1
commit
2e0b9456a9
@@ -69,6 +69,44 @@ Volba prezije obnoveni stranky (localStorage). Kdyz ulozena firma uz mezi
|
||||
`access.tenants` neni - clovek z ni odesel, prihlasil se nekdo jiny na tomtez
|
||||
pocitaci - spadne se na vychozi firmu uctu, aby kazdy dotaz nekoncil na 403.
|
||||
|
||||
## Prava plati za firmu, ne za cloveka
|
||||
|
||||
`permissionsOf(user, tenantId)` pocita prava **v jedne firme**. Firma je
|
||||
povinny argument: kdyby byla nepovinna, prvni volani bez ni by tise vratilo
|
||||
vsechna prava, a presne takova chyba se nehleda.
|
||||
|
||||
Driv se prava scitala pres vsechna clenstvi. Znelo to rozumne - pravo je bud,
|
||||
nebo neni - ale znamenalo to, ze **kdo je spravce v jedne firme, jednal jako
|
||||
spravce ve vsech, kam patri**. Uzivatel ve dvou firmach je vzacny, dusledek ne.
|
||||
|
||||
| Kde se pta | Ktera firma rozhoduje |
|
||||
| -------------------------- | --------------------------------- |
|
||||
| Akce nad ticketem | firma **toho ticketu** |
|
||||
| Uprava zaznamu v nastaveni | firma **toho zaznamu** |
|
||||
| Zalozeni ticketu, helpdesk | firma, kterou ma clovek prepnutou |
|
||||
| Zalozky v navigaci | firma, kterou ma clovek prepnutou |
|
||||
|
||||
Rozdil mezi prvnimi dvema a zbytkem je zamer: kdo edituje zaznam jine firmy,
|
||||
musi mit pravo **tam**, ne tam, kde je zrovna prepnuty.
|
||||
|
||||
`tenantId: null` znamena "mimo firmu", tedy zadna zakaznicka prava. Deje se to
|
||||
u uctu bez clenstvi. Spravce platformy ma vzdycky vsechno - to je nase pravo,
|
||||
ne zakaznicke.
|
||||
|
||||
Cizi firemni role se ignoruje, i kdyby na ni clenstvi odkazovalo: jinak by
|
||||
stacilo pripsat si ji do clenstvi v jine firme a prava by se prenesla.
|
||||
|
||||
### Systemove role se srovnavaji s kodem pri startu
|
||||
|
||||
Vychozi sada se pouzije **jen do prazdneho uloziste**. Nove pravo v katalogu by
|
||||
se proto k uz bezici instalaci nikdy nedostalo: `role_admin` by zustala s vyctem
|
||||
ulozenym pri prvnim startu a nova zalozka by se spravci firmy neobjevila.
|
||||
|
||||
`syncSystemRoles()` proto pri startu srovna prava systemovych roli s tim, jak
|
||||
jsou napsane v kodu. Meni **jen prava**, jen u roli s `tenantId: null` a jen
|
||||
u tech, ktere jsou v `systemRoles()`. Nazvu se to netyka (ten uz nekdo mohl
|
||||
zmenit) a vlastnich roli firmy uz vubec.
|
||||
|
||||
## Server je autorita
|
||||
|
||||
Vsechno rozhoduje `src/data/access.ts`, jedno misto pro cely portal. Kdyby se to
|
||||
@@ -149,13 +187,6 @@ podle toho, ktera firma je prave zvolena.
|
||||
|
||||
## Co chybi
|
||||
|
||||
**Prava se scitaji pres vsechny firmy, neprepocitavaji se podle vybrane.**
|
||||
`permissionsOf(user)` vezme role ze vsech clenstvi dohromady. Kdo je spravce
|
||||
v jedne firme a resitel v druhe, ma prava spravce i po prepnuti do te druhe.
|
||||
Data se tim neprolomi - server je porad filtruje podle firmy - ale tlacitka
|
||||
ukazuji vic, nez by mela. Napravit to znamena predat firmu do `permissionsOf`
|
||||
a prepocitat cache za dvojici uzivatel a firma.
|
||||
|
||||
| Chybi | Poznamka |
|
||||
| ------------------------- | ------------------------------------------------ |
|
||||
| Sprava clenstvi z portalu | memberships jdou zmenit jen v kodu |
|
||||
|
||||
@@ -2,6 +2,37 @@
|
||||
|
||||
Nejnovejsi nahore.
|
||||
|
||||
## 2026-08-26 - prava plati za firmu, ne za cloveka
|
||||
|
||||
`permissionsOf(user)` scitalo role pres vsechna clenstvi. Kdo byl spravce
|
||||
v jedne firme, jednal jako spravce ve vsech, kam patril. Uzivatel ve dvou
|
||||
firmach je vzacny, dusledek ne - to neni edge case, to je diera v pravech.
|
||||
|
||||
### Zmeneno
|
||||
|
||||
- **Firma je povinny argument** u `permissionsOf`, `hasPermission`
|
||||
i `hasAnyPermission`. Zamerne povinny: kdyby byl nepovinny, prvni volani bez
|
||||
nej by tise vratilo vsechna prava. Prekladac tim rovnou nasel vsech ctrnact
|
||||
mist, ktera se ptaji.
|
||||
- **Kazde misto se pta za tu spravnou firmu.** Akce nad ticketem za firmu toho
|
||||
ticketu, uprava zaznamu za firmu toho zaznamu, zalozky a helpdesk za firmu,
|
||||
kterou ma clovek prepnutou. Kdo edituje zaznam jine firmy, musi mit pravo tam,
|
||||
ne tam, kde je zrovna prepnuty.
|
||||
- **Cizi firemni role se ignoruje**, i kdyby na ni clenstvi odkazovalo. Jinak by
|
||||
stacilo pripsat si ji do clenstvi v jine firme a prava by se prenesla.
|
||||
- **Cache prav ma v klici firmu.** Bez toho by prvni dotaz odpovedel i na druhou.
|
||||
- **`readScope` cte z jedne firmy, te prepnute**, ne ze vsech, kam clovek patri.
|
||||
V nastaveni se driv michaly typy ticketu a role napric firmami bez ohledu na
|
||||
vyber - stejna vada jako u prepinace, jen na jinem miste.
|
||||
|
||||
### Opraveno
|
||||
|
||||
- **Systemove role se pri startu srovnaji s kodem** (`syncSystemRoles`).
|
||||
Vychozi sada se pouzije jen do prazdneho uloziste, takze nove pravo
|
||||
v katalogu se k uz bezici instalaci nikdy nedostalo - `ticket.create`
|
||||
a obe prava helpdesku by spravci firmy nikdy nenabehla a zalozka by se
|
||||
neobjevila. Meni se jen prava, jen u nasich roli, nazvu se to netyka.
|
||||
|
||||
## 2026-08-26 - prepinac firmy plati pro cely portal
|
||||
|
||||
Prepinac byl stav uvnitr stranky Prehled. Prepnuti na LogiTrans zmenilo prehled
|
||||
|
||||
Reference in New Issue
Block a user