ďťż

[PHP] System uprawnień. Jak wybrać ze wszystkich grup najwyższe uprawnienia.

       

Podstrony


telcocafe

Cześć mam funkcje:
function checkPrivileges($privName,$privMin) { $groupsArray = explode(':|:', $_SESSION['user_groups']); $i=0; $end = false; while(!$end) { $question = sql("SELECT group_id,group_privileges FROM users_groups WHERE group_id='".$groupsArray[$i]."'"); $row = mysql_fetch_assoc($question); if($row['group_privileges'][$privName] == $privMin) { $end = true; $havePrivileges = true; } else { if($i == count($groupsArray)) { $end = true; $havePrivileges = false; } else { $i++; } } } if($havePrivileges == true) { return true; } else { return false; } }
Która odpowiada za sprawdzanie uprawnień na mojej stronie.
Chciałbym że ta funkcja była wykonywana tylko raz a jej wynik byłby zapisywany do zmiennej sesyjnej.
Działa ona na zasadzie takiej że zmiennej $_SESSION['user_groups'] są przechowywane identyfikatory przynależności do danej grupy użytkownika. Funkcja rozdziela identyfikatory grup:
$groupsArray = explode(':|:', $_SESSION['user_groups']);
Po czym w pętli sprawdza pobierając dane o grupach czy użytkownik ma uprawnienia do danego zasobu.

dane w bazie:
grupa superusers = yyyyyyyyyynyynnnnyy;
grupa users = yyyyynnnnnyyyyynnnn;

I chciałbym żeby jeśli użytkownik należy do obu grup to funkcja miałaby zapisać litery uprawnień te które są wyższe do zmiennej sesyjnej:
zmienna sesyjna = yyyyyyyyyynyyyynnyy

Nie mam pomysłu jak to zrobić.
Help :(

EDIT >
potem zmodyfikowałbym funkcje tak aby sprawdzała uprawnienia ze zmiennej sesyjnej jeśli takowa by istaniała i nie pobierała znowu danych z bazy MySQL, a jeśli by nie iestaniała to by pobierała te dane i zapisywała w zmiennej sesyjnej. Chodzi o taka mała optymalizacje skryptu.
Użytkownik orglee edytował ten post 30 sierpień 2006, 17:44


Mój pomysł polega na tym, aby grupy miały "poziomy" dostępów, a user może należeć tylko do jednej z nich. Każdy zasób ograniczony ma group_id, który określa, jaka grupa minimalna (o najniższych uprawnieniach) może oglądnąć dany zasób.

Zilustruję:
Wchodzi user (zalogowany) na stronę ograniczoną. W sesji ma swój id. Funkcja sprawdza, do jakiej grupy pasuje user. Porównuje poziom uprawnień (im wyższy, tym lepsze uprawnienia) z minimalnymi uprawnieniami dla danej strony. Jeśli są >= może wejść. Inaczej wyświetla się błąd, czy coś innego.

Mam nadzieję, że to rozwiąże Twój problem, ale jednak znów się nie wyraziłeś dostatecznie zrozumiale...

No właśnie założenie fajne ale planując ten systemik wykluczyłem z prostego powodu.
Jeśli użytkownik będzie miał mieć dostęp np do działu download i do news oraz taktyk to będę musiłą tworzyć dla niego oddzielną osobną grupę, a tak to należy do kilku grup i którejś jest w końcu dostęp do poszczególnych działów. Pozatym ładniej to będzie wyglądać w profilu :P
Zamiast NiusoModeratoDownloader
będzie Newsman, Board Moderator Download Menagment =]
Edit >
Przykład:

NewsMenagmentAccess = 0;
NewsAdd = 1;
NewsEdit = 3;
NewsDelete = 4;
ArtsMenagmentAccess = 5;
ArtsAdd = 6;
ArtsEdit = 7;
ArtsDelete = 8;
DLMenagment = 9;
DLAddFile = 10;
DLDeleteFile = 11;

12 różnych uprawnień.

Administrator = yyyyyyyyyyyy
Newsman = yyyynnnnnnn
ArtilesManager = nnnnyyyynnn;
DownloadManager = nnnnnnnnyyy

Użytkownik jest członkiem grup Newsman i DownloadManager,
więc powinien mieć dostęp do pierwszych 4 funkcji i 3 ostatnich.
Teraz żeby nie wysyłać co chwila zapytać o uprawnienia do bazy danych, tworzymy zmienna sesyjną która przechowuje uprawnienia Newsman'a i DownloadMenager'a z tym że:
DLMenag = yyyynnnnnnn
NewsMan = nnnnnnnnyyy

Jak widać oba się różnią kilkoma y i n.
Teraz chce do zmiennej sesyjnej zapisać 'sumę' tych dwóch ciągów.
Jak napisać funkcję która z tych dwóch podanych ciągów wybierze mi ciąg:
yyyynnnnyyy
Użytkownik orglee edytował ten post 30 sierpień 2006, 18:46
No to nie można po prostu zapisać, do których działów (modułów) ma dostęp? I wtedy też explode i szukasz w tablicy id aktualnej strony/modułu/działu/czegokolwiek.




No to nie można po prostu zapisać, do których działów (modułów) ma dostęp? I wtedy też explode i szukasz w tablicy id aktualnej strony/modułu/działu/czegokolwiek.

Zerknij na post powyżej chyba teraz dobrze wyjaśniłem o co mi chodzi.

for ($i=0; $i<count($arr1); $i++) { if ($arr1[$i]=='y' || $arr2[$i]=='y') $arr3[$i] = 'y'; else $arr3[$i] = 'n';

Może coś takiego?

Ew. możesz się pobawić array_diff() oraz array_intersect().
Użytkownik pbnan edytował ten post 30 sierpień 2006, 18:57
function checkPrivileges($privName,$priv) { if(!isset($_SESSION['user_privileges'])) { $groupsArray = explode(':|:', $_SESSION['user_groups']); $privilegesArray=array(); for($i=0; $i<=count($groupsArray); $i++) { $question = sql("SELECT group_id,group_privileges FROM users_groups WHERE group_id='".$groupsArray[$i]."'"); $row = mysql_fetch_assoc($question); $privilegesArray[$i] = $row['group_privileges']; } for($i=0; $i<=strlen($privilegesArray[0])-1; $i++) { for($j=0; $j<=count($privilegesArray); $j++) { if($privilegesArray[$j][$i] == 'y') { $user_privileges[$i] = 'y'; break; } else { $user_privileges[$i] = 'n'; } } } $_SESSION['user_privileges'] = $user_privileges; if($_SESSION['user_privileges'][$privName] == $priv) { return true; } else { return false; } } else { if($_SESSION['user_privileges'][$privName] == $priv) { return true; } else { return false; } } }

Edit >
Topic [SOLVED]
Użytkownik orglee edytował ten post 30 sierpień 2006, 20:35
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.