NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Oprávnění

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Tomáš Holý:24.9.2017 11:52

Ahoj, potřeboval bych poradit. Mám systém, kde jsou uživatelé, kteří provádějí nějaké akce. Při každé té akci bych potřebaval ověřit, zda-li na ni má uživatel oprávnění. V předchozích projektech jsem to řešil tak, že jsem nenastavoval jednotlivá práva, ale skupiny. Ty jsem ukládal jako číslo do sloupce v tabulce uživatelů. Např. 1 byl návštěvník (prohlížet články), 2 člen (psát články), 3 moderátor (schvalovat a mazat články) a 4 administrátor (banovat uživatele, měnit skupiny). Většinou to fungovalo, ale mělo to několik nedostatků. Hlavní problém byl, když jsem chtěl nějakému členovi např. umožnit schvalovat články, ale nechtěl jsem, aby je mohl mazat. To v tomto systému nebylo možné. Navíc v novém projektu na kterém pracuji bude daleko více funkcí a těch skupin by muselo být ohromné množství a byl by v tom zmatek. Chtěl bych to tedy udělat tak, že každý uživatel bude mít v administraci spoustu checkboxů, kterými bude administrátor moci zvolit, která oprávnění má mít. A u každé akce se jen otestuje, jestli daný uživatel má dané oprávnění. Potom v další fázi se to může automatizovat, aby když zvolím, že chci uživateli dát moderátorská práva, tak automaticky dostane např:

ARTICLE_WRITE, ARTICLE_EDIT, ARTICLE_EDIT_OTHERS, ARTICLE_DELETE, ARTICLE_DELETE_OTHERS, ARTICLE_APPROVE

To už není problém. Jak nejlépe tyto oprávnění ukládat? Nejprve mě napadlo ukládat to jako jednotlivé sloupce v tabulce uživatelů, ale představa, že mám v tabulce 80 sloupců pro oprávnění je hloupá... Malinko lepší by asi bylo dát sloupce pro oprávnění do samostatné tabulky, to ale stále není nic moc... Potom mě napadlo ukládat do jednoho sloupce všechna oprávně jako text, oddělené třeba čárkou, ale tam mi přijde, že by bylo zbytečně mnoho problémů při práci s těmi oprávněními.

Nakonec mě napadlo ukládat přidělení každého oprávnění jako samostatný záznam, např. takto:

id uzivatele_id opravneni
1 1 ARTICLE_WRITE
2 2 ARTICLE_WRITE
3 2 ARTICLE_DELETE
4 2 ARTICLE_APPROVE
    ...

To mi připadá asi zatím nejlepší, bude se jednoduše ověřovat, zda-li uživatel má dané oprávnění:

SELECT COUNT(*)
FROM opravneni
WHERE uzivatele_id=2 AND opravneni='ARTICLE_APPROVE'
LIMIT 1

I se budou jednoduše oprávnění přidávat a odebírat. Zároveň, kdyby byla v budoucnu potřeba oprávnění s hodnotou (např. maximální počet článků), tak jen přidám sloupec value a trochu poupravím metodu pro testování oprávnění. Jen nevím, bude v pořádku, když se při každé akci uživatele bude provádět tento dotaz na databázi? Nebude to při vyšším počtu zárověň pracujících uživatelů databází příliš zatěžovat, nebo tak něco? :D Zatím jsem vždy uložil číslo skupiny do $_SESSION['group'] a jen testoval jestli je větší nebo rovno potřebnému oprávnění.

Jak by jste oprávnění řešili vy? Díky!

 
Odpovědět
24.9.2017 11:52
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:24.9.2017 11:59

Ahoj, zkus použít bitmask. Jedná se o takový zkrácený datový typ. Úložiš si do db číslo a podle bitových operací pak zjistujes, na co má uživatel právo. Pomocí operátoru &

Editováno 24.9.2017 12:01
 
Nahoru Odpovědět
24.9.2017 11:59
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:24.9.2017 12:02

např

const FLAG_1 = 0b0001; // 1
const FLAG_2 = 0b0010; // 2
const FLAG_3 = 0b0100; // 4
const FLAG_4 = 0b1000; // 8

function show_flags ($flags) {
  if ($flags & FLAG_1) {
    echo "You passed flag 1!<br>\n";
  }
  if ($flags & FLAG_2) {
    echo "You passed flag 2!<br>\n";
  }
  if ($flags & FLAG_3) {
    echo "You passed flag 3!<br>\n";
  }
  if ($flags & FLAG_4) {
    echo "You passed flag 4!<br>\n";
  }
}

show_flags(FLAG_1 | FLAG_3);

Takže, když tam hodíš číslo třeba 7, tak ti vylezou flagy 1-3, protože 1+2+4 = 7
Můžeš si všimnout, že to jde postupně. 2 na pořadí, v jakém to je. Počítáno od nuly.

Editováno 24.9.2017 12:04
 
Nahoru Odpovědět
24.9.2017 12:02
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:24.9.2017 12:08

Popřípadě ty konstanty můžeš vyjádřit ještě jinak. Např takto

const FLAG_1 = 1; // 1
const FLAG_2 = 10; // 2
const FLAG_3 = 100; // 4
const FLAG_4 = 1000; // 8
// atd ...

Pokud znáš u linuxu příkaz chmod, využívá to stejný systém (myslím)

 
Nahoru Odpovědět
24.9.2017 12:08
Avatar
Odpovídá na Jan Blažek
Tomáš Holý:24.9.2017 12:15

Jo, to znám, ale nikdy jsem to nikde sám nepoužil. Nebude to nepraktické na programování? Když tam budu mít nějaké třeba 40ti bitové číslo, tak za chvíli zapomenu, který bit je jaké oprávnění a které jsou ještě volné... Jinak to je asi celkem dobré.

 
Nahoru Odpovědět
24.9.2017 12:15
Avatar
Bertram
Člen
Avatar
Odpovídá na Tomáš Holý
Bertram:24.9.2017 12:32

Asi by to chtělo trochu seskupit, zkus se inspirovat.

 
Nahoru Odpovědět
24.9.2017 12:32
Avatar
Odpovídá na Bertram
Tomáš Holý:24.9.2017 12:44

To je pěkné, ale tam vůbec neřeší nějaké ukládání do databáze...

 
Nahoru Odpovědět
24.9.2017 12:44
Avatar
Bertram
Člen
Avatar
Odpovídá na Tomáš Holý
Bertram:24.9.2017 13:49

Do databáze ukládáš už jenom roli. Kolik konfigurací budeš mít, pět, šest? Jednotlivým rolím pak přísluší jeké operace s jakými zdroji mohou provádět.

 
Nahoru Odpovědět
24.9.2017 13:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.