Autor Zpráva
Joker
Profil *
Zdravím,
Nemáte někdo zkušenosti s vytvářením tabulky práv uživatelů? Mám tabulku uživatelů a chci jim přidělit určitá oprávnění... každé oprávnění je bool: uděleno/odepřeno. A takových oprávnění existuje třeba deset.

(Ještě bych podotkl, že jsem zkoušel Googlit, jenže tohle se hledá strašně špatně, protože 95% vrácených výsledků je něco jako "jak nastavit oprávnění pro databázové tabulky")

První řešení by bylo přidat sloupec prava nějakého velkého číselného typu jednotlivá práva by odpovídala bitům toho čísla (tj. práva by se získala přes modulo). Ale z údržby takového řešení mám docela strach.

Takže tabulka práv a ve sloupci prava bude ID oprávnění.
No a teď jsou dva způsoby... Často jsem třeba viděl tohle řešení:
prava_id, r_pravo_1, r_pravo_2, r_pravo_3,...
a hodnota každého práva je nula nebo jednička, nula=odepřeno, jednička=uděleno.

A napadlo mě ještě jiné řešení: sloupce by byly: prava_id a granted - typu CHAR nebo VARCHAR a struktura by pak vypadala nějak takhle:
prava_id - granted
1 - "r_pravo_1"
1 - "r_pravo_2"
2 - "r_pravo_1"
...

Udělení práva by se určovalo jako: existuje záznam = uděleno, neexistuje záznam = odepřeno.
Výhoda toho posledního řešení je jednodušší přidávání nového oprávnění, stačí přidat nové řádky do databáze.
Úplně nejčistší řešení by teda bylo místo textového názvu práva mít nějaké ID práva a ještě další tabulku popisků práv.


Co si o tom myslíte, které řešení je nejlepší? Máte někdo zkušenosti s takovýmhle typem tabulek? Případně máte ještě jiné, lepší řešení? Dík za rady
Aesir
Profil
Joker
Hodně záleží na velikosti a složitosti aplikace, já například používám systém skupin (rolí), takže mám tabulku uživatel-skupina-oblast-přístup, kde sloupec přístup je bool, ostatní string a můžou nabývat konkrétní hodnoty nebo ALL.
Při pokusu o přístup k dané oblasti sestavím dotaz podle přihlášeného uživatele, jeho skupiny a oblasti do které se snaží přistupovat, z výsledku vyberu pravidlo, které pro daný přístup vyhovuje nejvíce a vracím true/false.
Kajman_
Profil *
seznam prav
pravo_id, popis, disabled

prideleni prav
user_id, pravo_id, disabled
Joker
Profil *
Díky za reakce.

Celá ta aplikace není momentálně zas tak složitá (vpodstatě je to takový polo-CMS), ovšem potenciálně se může zesložitit, znáte to :-)

2 Kajman_
Tohle řešení je to, co jsem popisoval jako "úplně nejčistší řešení" a je mi sympatické z důvodu, snadné rozšiřitelnosti aplikace o nová práva. Já jen, že tohle řešení napadlo mě, zatímco to řešení přes sloupce jsem viděl v praxi (konkrétně jsem koukal jak je to udělané u phpBB fóra). Tak jsem si říkal, že třeba je nějaký důvod to tak udělat.

A ještě- napadlo mě v tomhle případě pak práva kontrolovat dotazem
"SELECT DISTINCT pravo_id FROM prava WHERE user_id=1 AND (pravo_id=1 OR pravo_id=3 OR pravo_id=4)" a následně by ověření bylo, zda num_rows>1 pokud chci alespoň jedno z práv, anebo num_rows=3 pokud chci všechna práva. (to je konkrétní příklad, v praxi by to samozřejmě sestavoval skript z proměnných)
Je to čisté anebo "prasárna"?
Joker
Profil *
oprava:
zda num_rows>1 pokud chci alespoň jedno z práv
má být:
zda num_rows>0 pokud chci alespoň jedno z práv
Kajman_
Profil *
To je už Váš salám. Já bych použil or nebo and.
Joker
Profil *
To je už Váš salám. Já bych použil or nebo and.
Jak? Teď to trochu nechápu...

Mně šlo o to, jestli ta úvaha je programátorsky "čistá" anebo "prasárna". Ale fungovat by to mělo, lámu si s tím už chvíli hlavu a zdá se mi to neprůstřelné (přes ty podmínky by prošel jedině duplicitní řádek a i kdyby se tam náhodou dostal, odfiltruje ho SELECT DISTINCT)

Každopádně, asi to udělám tak jak píšete, přece jen se mi to zdá lepší, než velká tabulka, kde sloupce odpovídají jednotlivým právům.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0