7

Jestem częścią zespołu tworzącego aplikację webową wykorzystującą PHP i MySQL. Aplikacja będzie miała wielu użytkowników z różnymi rolami. Aplikacja będzie również używana w sposób rozproszony geograficznie. W związku z tym musimy stworzyć system kontroli dostępu, który działa na następujących dwóch poziomach:PHP Access Control System

  1. uprawnień użytkownika sterujące do konkretnych stron php tj udostępnia lub blokuje dostęp do określonych stron (lub elementów interfejsu użytkownika) na podstawie roli użytkownika. Na przykład: użytkownik może mieć dostęp do strony "Uczniowie", ale nie do strony "Nauczyciele".
  2. Steruje uprawnieniami użytkowników dla określonych rekordów bazy danych, tzn. Modyfikuje zapytania do bazy danych, tak aby były wyświetlane tylko określone rekordy. Na przykład dla użytkownika na poziomie miasta powinny być wyświetlane tylko te rekordy, które odnoszą się do konkretnego miasta użytkownika, podczas gdy dla użytkownika na poziomie krajowym powinny być wyświetlane rekordy dla WSZYSTKICH MIAST w danym kraju.

Potrzebuję pomocy w zaprojektowaniu systemu, który poradzi sobie z obydwoma rodzajami kontroli dostępu. Punkt nr. 1 wydaje się dość prosty. Jednak zupełnie nie rozumiem, jak zrobić punkt numer 2 bez zakodowania informacji w zapytaniach SQL.

Każda pomoc zostanie doceniona.

góry dzięki

Vinayak

Odpowiedz

12

Byłem w podobnej sytuacji kilka miesięcy temu. Zauważyłem, że narzędzia takie jak Zend_ACL działają wspaniale, jeśli po prostu sprawdzisz poziom dostępu do pojedynczego elementu (lub dość niska ich liczba). Nie działa, gdy trzeba uzyskać ogromną listę elementów, do których użytkownik ma dostęp. Stworzyłem niestandardowe rozwiązanie tego problemu, używając wzoru Business Delegate. BD zapewnia logikę biznesową, którą można zastosować w określonym kontekście.W tym scenariuszu logika SQL została dostarczona i użyta jako warunek filtrowania w podselekcji. Patrz poniższe wykresy:

alt text http://gruz.epsi.pl/g/uml/permissions.png

I sekwencja diagram ilustruje połączenia zamówić:

alt text http://gruz.epsi.pl/g/uml/permissions-s2.png

I blogged about this solution niestety to wszystko jest w języku polskim, ale można znaleźć fragmenty kodu i schematów poręczny. Co mogę powiedzieć, implementacja nie jest bułka z masłem, ale pod względem wydajności jest mistrzem w porównaniu z iteracyjnym sprawdzaniem dostępu dla każdego elementu na liście. Ponadto powyższa infrastruktura obsługuje nie tylko jeden rodzaj pozycji na liście. Może służyć podczas uzyskiwania dostępu do różnych list, czy to listy miast, krajów, produktów lub dokumentów, o ile elementy na liście implementują interfejs IAuthorizable.

+0

Witam, znam jego starą odpowiedź, ale potrzebuję tylko wyjaśnienia na [diagramie klasy UML] (http://en.wikipedia.org/wiki/Class_diagram), co oznaczają różne typy strzał ?, (pełny, przerywany i szarzejący) – Triztian

+1

@Triztian - Stałe ze strzałkami to wywołania metod, przerywane pionowe linie przedstawiają linie życia, a kreskowane poziome linie często oznaczają powrót –

1

nie wiem o szczegółach problemu ale Zend Framework ma dość silne ACL i AUTH zestaw komponentów, można patrzeć. Dobre rzeczy, takie jak bardzo precyzyjna kontrola dostępu, przechowywanie danych dla utrzymania, zaawansowane reguły warunkowe.

1

Wydaje mi się to, czego potrzebujesz to: (użyję kraj/region/example miasta)

  1. listę wszystkich krajach. Każdy "kraj" ma identyfikator.
  2. Lista wszystkich stanów w poszczególnych krajach. Każdy stan jest powiązany z identyfikatorem coutnry, ale ma również swój własny unikalny identyfikator.
  3. Lista wszystkich miast. Każde miasto jest powiązane z państwem lub bezpośrednio z krajem i ma flagę wskazującą, które.

Dla użytkownika miejskiego oczywiście wyszukuj i wyświetlaj tylko te rekordy odnoszące się do miasta, które pasują do jego identyfikatora. Jednak jeśli chodzi o stan lub poziom krajowy, wyszukaj wszystkie zapisy dotyczące każdego miasta, które ma identyfikator pasujący do tego kraju (lub stan lub co ty).

Zasadniczo każda podgrupa jest zależna od grupy znajdującej się nad nią i mimo że nie pamiętam poprawnie, wierzę, że możesz użyć pod-zapytań do wykonania tej czynności.

+0

Witam Oznacza to jednak, że wyszukiwane hasła muszą być napisane inaczej dla każdego poziomu użytkownika. Moim problemem jest znalezienie sposobu, aby to samo zapytanie zwróciło inny zestaw wyników w zależności od poziomu użytkownika. – Vinayak

+0

@ vinayak.myopenid.com, i tak musiałbyś użyć innego zapytania, jeśli chcesz, aby serwer SQL wiedział, jaki masz poziom dostępu. Wygląda na to, że uprawnienia byłyby obsługiwane przez powiązanie wyrażeń w klauzuli WHERE z AND. Brzmi całkiem prosto. – strager

0

Jeśli nie wiesz, jak to zrobić, skorzystam ze schematu php, takiego jak Zend Framework, CakePHP lub Symphony. Wykonali dla ciebie ciężkie ćwiczenia i już mają jakiś system kontroli dostępu.

0

Mam podobne rozwiązanie do budowy i do tej pory postanowiłem użyć specyfikacji i ról, więc w rzeczywistości jedna rola miałaby pewne specyfikacje przywiązania. Jeśli wszystkie są spełnione, uprawnienie zostaje przyznane, w przeciwnym razie - przywraca domyślny dostęp do zasobów.

Szukałem, aby znaleźć kogoś, kto już wdrożył rozwiązanie, ale wydaje się, że nikt tego nie zrobił. Miejmy nadzieję, że to się nie uda :)