Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ACL, czyli jak powiedzieć "nie wolno"
Forum PHP.pl > Inne > Hydepark
batman
Mam małą zagwozdkę. W różnych systemach, różnie to rozwiązywałem, jednak chciałbym poznać wasze zdanie na ten temat.
Załóżmy taką sytuację. Jest serwis, w którym istnieje kilka grup użytkowników oraz różne zasoby. Oczywistym jest, że różne grupy mają różny poziom dostępu. Jeśli jakiś użytkownik, który nie ma uprawnień, próbuje dostać się do pewnego zasobu, otrzymuje komunikat błędu. Jaki powinien być ten komunikat?
1. 404 - nie ma takiej strony?
2. Wyświetlić stronę z informacją o braku dostępu do zasobu?
3. Wyświetlić formularz logowania?
AxZx
a moze wyswietlic podstrone z informacja o braku uprawnien do przegladania tej strony + link do formularza logowania?
nrm
zależy od typu zawartości - czasami wystarczy redirect na /login (bo po logowaniu będzie ok), czasami potrzebny będzie komunikat z okrojoną zawartością strony (np. "profil tylko dla przyjaciół"), a czasami kombinacja obu: redirect z komunikatem.

Do takich komunikatów bardzo przydają się tzw. flash_messages (msg w sesji defaultowo żyjące 1 przeładowanie).
nevt
ja po prostu ograniczam takiemu użytkownikowi możliwość przejścia do podstron / uruchamiania funkcji do takich na jakie ma uprawnienia. tzn. cały interfejs jest dynamiczny i wyświetla tylko te elementy, które są niezbędne dla danego użytkownika. moje doświadczenia wskazują, że nawet jak sto razy user po kliknięciu w przycisk "edytuj" albo "usuń" widzi komunikat "niestety, masz uprawnienia tylko do przeglądania" to i tak klika kolejny raz... a jak w ogóle nie widzi przycisków " edytuj" i "usuń" to go nic nie korci smile.gif
MMPrime
Tak, ale w wypadku gdy użytkownik straci sesję lub podąży za linkiem z gady-gadu, jakiegoś forum przedstawiającym krok po kroku co ma zrobić to jeśli nie jest zalogowany(a jest to konieczne) to trzeba wykonać jakąś akcję.

Najłatwiej przekierować na podstronę logowania z zachowaniem adresu url skąd użytkownik przyszedł i razem z id wiadomości którą trzeba wyświetlić petentowi.
nrm
@nevt: słusznie, ale jak napisałem wyżej wszystko zależy od kontentu i nie ma jednej słusznej odpowiedzi. Trzymając się tego przykładu z profilem to muszę userowi wyświetlić stronę z profilem i pozbawioną jakiś tam informacji z komunikatem dlaczego nie ma pełnego wglądu i z menu np. z zaproszeniem do kontaktów (bo jakbym mu odciął wczytanie profilu to nie miałby nawet jak kogoś zaprosić do kontantu).
batman
Cytat
ja po prostu ograniczam takiemu użytkownikowi możliwość przejścia do podstron / uruchamiania funkcji do takich na jakie ma uprawnienia

To jest oczywiste, ale są przypadki, że ktoś kombinuje z linkami, podmienia adres, itp. W takiej sytuacji nie ma możliwości ukrycia przycisku.
jastu
W kontrollerze

  1. <?php
  2. try
  3. {
  4. // sprawdzane zasoby
  5. $object = new Object();
  6.  
  7. // sprawdzenie uprawnień odczytu do obiektu, $this->client to obiekt bieżącego użytkownika
  8. $this->client->read($object,true);
  9.  
  10. // dalszy kod tzn. reszta danych, logiki
  11.  
  12. }
  13. catch(AccesExcepton $e)
  14. {
  15. // kod obsługi braku dostępu
  16. }
  17. ?>


w szablonie
  1. <?php
  2. if($client->read($object)) 
  3. {
  4. // wyświetl przycisk
  5. }
  6. ?>


Zapis
Client::read($object, $throw = false)
to metoda, w której drugi parametr decyduje czy wygenerować wyjątek - czy zwrócić false/true
($client to obiekt użytkownika)

Jeżeli ktoś ma lepszy sposób, chętnie poczytam

...jeszcze coś mi do głowy przyszło : można napisać klase do tworzenia przycisków (linki i kontrola uprawnień byłaby w jednym miejscu)
  1. <?php
  2. $object->deleteButton($user);
  3. ?>

Klasa ta gdzieś była by dziedziczona np. model ->klasa_linki_uprawnienia -> klasa_właściwa ($object)

luźna myśl.....
batman
@jastu
Tak się składa, że robię na ZF, więc mój kod wygląda nieco inaczej winksmiley.jpg
Chodzi mi o uwagi mniej praktyczne winksmiley.jpg
bim2
Mhh, ja wyświetłam zawsze brak uprawnień. Sprawdzam to w trakcie odczytywania z adresu akcji i metody. Jeśli user ma prawa, to mu się wyświetli, jeśli nie to nie. A jak z linkami?
if($this->getPlugin('Access')->can('Akcja', 'Model')) { wyswietl odpowiedni link }
Jeśli chodzi o co wyświetlić userowi co nie, to w templatce zwykła ifka moim zdaniem starcza. Nie ma tutaj co kombinować. snitch.gif Aha, taka myśl mi przyszła, żeby sprawdzać referera. Jak z naszej strony, to link do logowania (mówię tutaj, np o edytuj linku), a jak bez referera to 404. smile.gif
NoiseMc
Ja daje formularz logowania z 403, zapamietuje akcje i po zalogowaniu wracam ...
Jabol
Aczkolwiek czasami lepiej zrobić 404 (tzn. dokładnie tą samą akcję jaką dajesz w przypadku 404) - dla różnych krytycznych zasobów. Szczególnie jeżeli np. coś po zalogowaniu dostępne tylko dla pewnej niewielkiej podgrupy osób które mogą się zalogować. Wtedy lepiej nie zdradzać co istnieje w serwisie a co nie.
Jarod
Ja mam to rozwiązane tak. Mam klasę ACLConfiguration, która zawiera wykaz (w postaci tablicy) akcji i wymaganych uprawnień z parametrami. Do jednej akcji może być przypisane kilka uprawnień ale posiadanie tylko jednego z nich pozwala na uruchomienie akcji. W kontrolerze sprawdzam czy user jest zalogowany i jeżeli akcja, którą chce odpalić znajduje się w klasie ACLConfiguration to sprawdzam czy posiada odpowiednie uprawnienia. Jeśli nie to jest przekierowany na stronę logowania. Oczywiście user nie widzi przycisków jeśli nie ma uprawnień. Manipulowanie linkami nic nie da.Sprawdza się w 100%.
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.