Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] System uprawnien
Forum PHP.pl > Forum > PHP
sivyer
Witam,

Kombinuje prawie caly dzien nad systemem uprawnien do panelu administracyjnego. Generalnie ma byc kilka grup (niezarejestrowani, zwykli userzy, moderatorzy, admini itd.), grupy beda dawaly tylko ogolne uprawnienia (np. dostep do komentarzy, dostep do panelu administracyjnego, ...).

Glownie mam problem z ulozeniem sprawnego systemu uprawnien do panelu administracyjnego. Na stronie jest przewidzianych kilkanascie dzialow na poczatek, z czasem bedzie ich przybywac. W kazdym dziale beda: tabele ligowe, wyniki, statystyki, sklady druzyn, profile graczy itd.
I teraz chodzi o to, zeby w panelu administracyjnym indywidualnie ustalac dla kazdego uzytkownika dostep do poszczegolnych czesci.

Skorzystalem z pomyslu kurtza z potegami dwojki, oto jak to sobie rozlozylem:
[php:1:cc5f9c6fa9]
// Poszczegolne podsekcje dla dzialu w panelu adm.
A - wyniki + statystyki : array("2","32","64","128","2048","4096","8192","32768");
B - kontuzje + transfery : array("4","32","256","512","2048","4096","16384","32768");
C - tabele : array("8","64","256","1024","2048","8192","16384","32768");
D - sklady + profile graczy : array("16","128","512","1024","4096","8192","16384","32768");

// Wszystkie kombinacje uprawnien jako kolejne potegi 2
// 1 - A = 2
// 2 - B = 4
// 3 - C = 8
// 4 - D = 16
// 5 - A+B = 32
// 6 - A+C = 64
// 7 - A+D = 128
// 8 - B+C = 256
// 9 - B+D = 512
// 10 - C+D = 1024
// 11 - A+B+C = 2048
// 12 - A+B+D = 4096
// 13 - A+C+D = 8192
// 14 - B+C+D = 16384
// 15 - A+B+C+D = 32768
[/php:1:cc5f9c6fa9]

Ponizej wersja 'na szybko' zmiany uprawnien dla uzytkownika:

[php:1:cc5f9c6fa9]
<?php

if( !isset($_POST['go']) ) {
?>
<form action=up.php method=post>
<table>
<tr><td><input type="checkbox" name="upr[]" value="A"></td><td>Wyniki + statystyki</td></tr>
<tr><td><input type="checkbox" name="upr[]" value="B"></td><td>Kontuzje + transfery</td></tr>
<tr><td><input type="checkbox" name="upr[]" value="C"></td><td>Tabele</td></tr>
<tr><td><input type="checkbox" name="upr[]" value="D"></td><td>Sklady + profile graczy</td></tr>
</table>
<input type=hidden name=go value=ok>
<input type=submit>
</form>
<?php
} else {
$rights = array(
"A" => "2",
"B" => "4",
"C" => "8",
"D" => "16",
"AB" => "32",
"AC" => "64",
"AD" => "128",
"BC" => "256",
"BD" => "512",
"CD" => "1024",
"ABC" => "2048",
"ABD" => "4096",
"ACD" => "8192",
"BCD" => "16384",
"ABCD" => "32768");

$tmp = '';

for( $i=0; $i<count($_POST['upr']); $i++ ) {
$tmp .= $_POST['upr'][$i];
}

echo $rights[$tmp];

}
?>
[/php:1:cc5f9c6fa9]

W bazie beda tabele z uprawnieniami dla uzytkownika w danym dziale:
Kod
user_id | section_id | user_rights



np.

1 | 1 | 32768


No i przy wejsciu na stronke sprawdzamy poziom uzytkownika z wymaganym dla danej stronki, np.

[php:1:cc5f9c6fa9]
<?php
$required = array("2","32","64","128","2048","4096","8192","32768");
$user_right = 128; // wybierane z bazy oczywiscie

if( array_search($user_right,$required) ) {
echo "Masz dostep";
} else {
echo "Nie masz dostepu";
}
?>
[/php:1:cc5f9c6fa9]

No i to tak mniej wiecej chyba tyle, co sadzicie o takim rozwiazaniu?
spenalzo
Uważam, że dobry to pomysł, ale od kiedy 1 ^ 2 = 2? :-)
Nitro
Cytat
Wszystkie kombinacje uprawnien jako kolejne potegi 2

Więc chodzi raczej o 2^1, a to równa się 2 tongue.gif
spenalzo
No tak, sorry.
Ale mogłoby być jeszcze 2^0=1.
RyPi
Witam

Przeglądam ten temat i zastanawiam się po co się męczyć i co ważniejsze po co męczyć bazę danych z przechowywaniem dużej ilosci danych, a pięć znaków przy czterech kategoriach wydaje mi się za dużo.

Skoro mamy kategorie A, B, C, D to uprawnienia do nich można zapisać w postaci 0 i 1 gdzie 0 - brak dostępu, a 1 - dostęp dozwolony czyli jeśli zezwolimy na dostęp do kategorii A i C to otrzymamy 1010, ABCD otrzymamy 1111. W tym momencie łatwo dodać następne kategorie EFGH. Nawet nie chcę liczyć jakby wyglądał dostęp do tych kategorii w postaci potęgi 2.

Co więcej otrzymując prawa w postaci zero-jedynkowej otrzymujemy jakąś liczbe w postaci binarnej więc łatwo korzystając nawet już z wbudowanych konwerterów w php zamienić ją na wartośc np. szesnastkową co nam zdecydowanie zmniejsza miejsce zajmowane w bazie np. dla Bin: 1111 HEX: F, więc dla 4 kategorii wystarczy jeden znak. Na swoje potrzeby napisałem własny konwerter zdaję się, że do postaci 215-tkowej, ale nie pamiętam dokładnie.

Teraz wchodząc na strone wystarczy sprawdzić jakie mamy prawa, jakich wymaga konketna część strony i porównać np.

[php:1:c8383bc1bf]<?php
$wymagane="3"; // czyli dostęp do C
$prawa="1011"; // pobrane z bazy i zmienione do postaci binarnej

if($prawa[$wymagane-1]=="1") echo "Masz dostep";
else echo "Nie masz dostepu";
?>[/php:1:c8383bc1bf]

Być może nie zauważyłem jakichś dodatkowych możliwości rozwiazania sivyer'a więc poprawcie mnie jeśli się myle, ale to które ja przedstawiam wydaje mi się bardziej funkcjonalne szczególnie przy wiekszej ilości kategorii tj. ABCDEFGHIJKL smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.