Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Rozróżnianie administratorów
Forum PHP.pl > Forum > Przedszkole
tomsi
Chciałem się Was poradzić jak rozwiązać następujący problem:

chciałem na swojej stronie zrobić administrację dla kilku typów i liczby administratorów. Jeden administrator główny miałby możliwośc robienia wszystkiego na stronie (dodawanie zdjęć, news'y, nowe kategorie w menu itd). Dodatkowo na stronie w panelu było by miejsce na rejestrowanie nowych administratorów (oczywiście ich konto zaczęło by działac po zatwierdzeniu przez głównego administratora), ale moje pytanie jest jak zrobić żeby np. administrator_pomocniczy_1 miał możliwośc tylko dodawania zdjęć a administratr_pomocniczy_2 tylko news'ów? J

ak to porządnie zorganizować?
marcio
Zrobic lvl np:
Super admin: 4lvl
Admin: 3lvl
Mod: 3lvl
User: 1lvl

Albo zrobic sesje z prawami np
  1. <?php
  2. $_SESSION['opt'] = 'prawa|prawa2'
  3. ?>


Robic explode() dla sesji i sprawdzac za pomoca in_array() czy jest dana opcja jak jest mozna robic jak nie to error
Pilsener
Najlepszą opcją jest oparcie struktury serwisu o drzewo - czyli np. artykuły to kategoria nr 5, która może mieć dowolną liczbę podkategorii. Teraz robisz sobie tabelę:

ID kategorii||login/ID usera||podgląd||edycja||itd. - rodzaje uprawnień

Zamiast rozbijać na pogląd/edycja itp. możesz zrobić flagi - np. od a do z i każda litera to inny zestaw uprawnień.
Pamiętaj też o dziedziczeniu uprawnień - ktoś kto ma zablokowany dostęp do kategorii wyżej, nie może przeglądać tych niżej i odwrotnie - dobrze by było, żebyś mógł nadać np. osobie xyz uprawnienia edycji do kategorii "Artykuły" i wszystkich podkategorii - wtedy po dodaniu podkategorii uprawnienia byłyby dziedziczone i nie musiałbyś ich znowu nadawać.

Da się to zrobić - ale wymaga to pracy oczywiście.
Axexis
Dużo prościej (co nie znaczy wydajniej) jest dorobienie po prostu kilku komórek w bazie danych.
Tj, że zamiast standartowego "login, password, email, level" itp dodać "can_addnews, can_addphotos, can_managegallery" itp.

Później tylko sprawdzać czy admin "can" i już smile.gif
Wykrywacz
Najprościej to przed button czy cokolwiek co wywołuje dalsze przejście do opcji edycji dodać w kodzie.
  1. <?php
  2. if($zmienna > 0){
  3. //wywołanie twojego butona1 prowadzącego gdzie trzeba
  4. }
  5. if($zmienna > 1){
  6. //wywołanie twojego butona2 prowadzącego gdzie trzeba
  7. }
  8. ?>

W bazie przy użytkowniku np. dodajesz pole
  1. [upr]
i jeżeli ktoś mam mieć uprawnienie do czegoś to uzupełniasz

No i przy logowaniu dodajesz warunek w którym pobiera wartość z pola upr (bądź osobnym zapytaniem) i np. wrzucasz sobie wynika dla upr do sesji aby nie powtarzać zapytania.

I to jest chyba najmniej inwazyjna metoda w gotowy kod jaka przychodzi mi na myśl winksmiley.jpg

Ale lepiej zainwestować w czas jeśli ma być to coś większego i potworzyć normalny system grupowy itd...
marcio
Cytat(Axexis @ 7.11.2008, 10:46:00 ) *
Dużo prościej (co nie znaczy wydajniej) jest dorobienie po prostu kilku komórek w bazie danych.
Tj, że zamiast standartowego "login, password, email, level" itp dodać "can_addnews, can_addphotos, can_managegallery" itp.

Później tylko sprawdzać czy admin "can" i już smile.gif


Drugo spodob o ktorym napisalem to jest wlasnie to mysle ze obydwa moje sposoby sie sprawdzaja uzywalem i obydwoch i bylo GIT
Wykrywacz
Cytat
Drugo spodob o ktorym napisalem to jest wlasnie to mysle ze obydwa moje sposoby sie sprawdzaja uzywalem i obydwoch i bylo GIT

Git? w czym? używaniu like?
Wszystko w tym wypadku jest gitarra o ile nie musisz używać tego do więcej niż kilku opcji. Bo potem naraz tworzy ci się zylion kolumn, ify też ci się rozrastają bo zamiast zrobić
np. 5 >$uprawnienia >1, to tworzysz cztery warunki z and....
to jak naprawianie auto poksyliną ;P
Malvegil100
  1. <?
  2. if (($_SESSION['dostep'] == 'Admin') OR ($_SESSION['dostep'] == 'Moderator')) {
  3. //tresc
  4. } else { echo 'Nie masz tu czego szukac';}
  5. ?>


Gdzie $_SESSION['dostep'] (pobierane jest z db z komórki 'poziom_dostepu' przy logowaniu) to:
- Admin
- Moderator
- VIP
- User
bim2
O boshe, ja mam tabele id_usera|action|method

I 'WHERE user_id=1 AND action = "news" AND method = "add"', później if mysql_num_rows>0 to uprawnienia są. Oczywiscie działa to w każdą stronę tj. można to przerobić na uprawnienia grup. Dać foreach($upr AS $v) { } i jak napotka w jakimś false to znaczy, ze uprawnień nie ma. :]
marcio
Cytat
Git? w czym? używaniu like?
Wszystko w tym wypadku jest gitarra o ile nie musisz używać tego do więcej niż kilku opcji. Bo potem naraz tworzy ci się zylion kolumn, ify też ci się rozrastają bo zamiast zrobić
np. 5 >$uprawnienia >1, to tworzysz cztery warunki z and....
to jak naprawianie auto poksyliną ;P


Czy ty w ogole wiesz co mowisz?

Kod logowania nie z zbyto rozbudowany:
  1. <?php
  2. if(!empty($_POST['login']) && !empty($_POST['pass']) && isset($_POST['loguj'])) {
  3.  
  4.  
  5. if($db = mysql_connect($pasy['host'], $pasy['login'], $pasy['haslo'])) {
  6.  mysql_select_db($pasy['baza']);
  7.  
  8. $login = filtruj(strip_tags($_POST['login']));
  9. $pass = filtruj(addslashes(htmlspecialchars(md5($_POST['pass']))));
  10.  $zap = ('select * from przegladarka where login = "'.mysql_real_escape_string($login).'" limit 1');
  11.   $wynik = mysql_query($zap, $db);
  12.    
  13. $tab = mysql_fetch_assoc($wynik);
  14.  
  15. if($tab['login'] == $login && $tab['pass'] == $pass) {
  16.  
  17.   setcookie("user", $login, time() + 3600);
  18.   setcookie("kod_id", $tab['kod'], time() + 3600);
  19.   setcookie("uprawnienia", $tab['uprawnienia'], time() + 3600);
  20.  
  21.   header("Location: url2.php") or die();
  22.  
  23.  
  24. }
  25.  
  26. else echo('<table align="center"><tr><td class="contents" align="center"><b style="color:#f00">Podales zly login i/lub haslo.</b></td></tr></table>');
  27. }
  28. else echo('<table align="center"><tr><td class="contents" align="center"><b style="color:#f00">Polaczenie z baza niemozliwe.</b></td></tr></table>');
  29. }
  30. ?>


Samo sprawdzanie praw podczac jakiejs czynnosci wyglada tak:
  1. <?php
  2. //na samym poczatku strony
  3.  
  4. $function = explode('|', $_COOKIE['uprawnienia']);
  5.  
  6. //np sprawdzanie czy sa prawa podczac tworzenia miniaturek:
  7.  
  8. if(!empty($_POST['x']) && !empty($_POST['y']) && isset($_POST['resize'])) {
  9.  
  10. if(in_array('presizer', $function)) {
  11.  
  12.  
  13. $x = (int)$_POST['x'];
  14. $y = (int)$_POST['y'];
  15.  
  16. if(is_integer($x) && is_integer($y)) {
  17.  
  18.  
  19. if($_POST['new_y'] == 'yes') $new_name_file = $_POST['new_name']; else $new_name_file = $_POST['old_name_file'];
  20.  
  21. resize($_POST['old_name_file'], $_POST['extension'],$x, $y, $new_name_file, $_POST['quality']);
  22.  
  23.    }
  24. else echo('<table align="center"><tr><td align="center"><b style="color: #000000">Zly typ danych dla szerokosci i wysokosci img.</td></tr></table>');
  25.  }
  26. else echo('<table align="center"><tr><td align="center"><b style="color: #000000">Nie masz uprawnien.</td></tr></table>');
  27. }
  28. ?>


Prawa w bazie wygladaja tak prawo|inne_prawo|etc...

Dodaje prawa user'ow za pomoca checkbox'ow bo mam taka potrzebe w moim systemie plikow oczywiscie mozna je inaczej przypisywac

Co do prawa numerycznych tak samo to wyglada jest kolumna Prawa a w niej wartosci od 1 do 4 przy kazdej czynnosci jest sprawdzenie czy $_COOKIE['prawa'] > 4 zeby robic czynnosci Administratora

Oczywiscie wszystkie jest bezpieczne gdy na kazdej stronie jest sprawdzenie czy dane z cookie sa takie same jak te z bazy, i nikt nie mowi o tworzeniu kilkanascie kolumn to ty to sobie ubzdurales.

Cytat
Gdzie $_SESSION['dostep'] (pobierane jest z db z komórki 'poziom_dostepu' przy logowaniu) to:
- Admin
- Moderator
- VIP
- User

Oczywiscie takie cos jest wolniejsze niz operacje na INT ale i tak nie widac roznicy biggrin.gif

P.S zreszta kazdy ma swoje moetody i dla niego wlasna jest zawsze najlepsza wystarczy ja dobrze zabezpieczyc a implementacja zalezy juz od czlowieka
tomsi
Widze, że jest parę odpowiedzi teraz muszę wybrać to najprostsze i najwygodniejsze...

~Pilsener
czyli zrobić w bazie, czyli najwanzijeszy amdin dodaje mniej waznego i daje mu uprawnienia i dodaje sie do bazy w polu edycja wartosc 1 czyli bedzie mogl edytować, w usuwaniu 1 bedzie mogl usuwac. Dobrze rozumiem? Jeśli tak to trochę by się to skomplikowało bo trzeba by rozróżniać edycje, np. zdjęć a wiadomości itd

~Wykrywacz
trochę nie rozumiem Twojego rozwiązania
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.