Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kontrola dostępu - część II.
Forum PHP.pl > Forum > PHP
Jarod
Witam,

chciałbym kontynuować wątek dotyczący kontroli dostępu w aplikacjach php, dlatego wszystkich, którzy nie zapoznali się z poprzednią częścią zachęcam do przeczytania http://forum.php.pl/index.php?showtopic=38...trola+dost%EApu

Poniżej przedstawię mój sposób na taką kontrolę (mam na myśli strukturę bazy) a przy okazji kilka pytań, które mnie dręczą.


Przypadek I: Grupy opisane rolami.

Mam 3 tabele (z przykładowymi danymi):


account
Kod
account_id | login   | password |blocked| expired | gropus                    |
-------------------------------------------------------------------------------
1          | admin   | pass     | 0     | 0       | Administratorzy           |
2          | jas     | fasola   | 0     | 0       | Marketing:Handlowy        |
3          | ptasiek | ptasiek  | 0     | 0       | Sprzedaż:Księgowość       |


groups
Kod
group_id | group_name      | group_description       | roles                                           |
--------------------------------------------------------------------------------------------------------
1        | Administratorzy | Administratorzy systemu | Role1:Role2:Role3:Role4:Role5:Role6:Role7:Role8 |
2        | Marketing       | Dział marketingu        | Role1:Role2                                     |
3        | Handlowy        | Dział handlowy          | Role3:Role4                                     |
4        | Sprzedaż        | Dział sprzedaży         | Role5:Role6                                     |
5        | Księgowość      | Dział księgowośći       | Role7:Role8                                     |



roles
Kod
role_id | role_name | role_description     |
--------------------------------------------
1       | Role1     | Jakieś uprawnienie 1 |
2       | Role2     | Jakieś uprawnienie 2 |
3       | Role3     | Jakieś uprawnienie 3 |
4       | Role4     | Jakieś uprawnienie 4 |
5       | Role5     | Jakieś uprawnienie 5 |
6       | Role6     | Jakieś uprawnienie 6 |
7       | Role7     | Jakieś uprawnienie 7 |
8       | Role8     | Jakieś uprawnienie 8 |


Proces autoryzacji wyglądałby mniej więcej tak:
1. Użytkownik podaje login i hasło
2. Po uprzedniej filtracji danych $_POST wykonujemy zapytanie SQL "coś na kształt":
  1. SELECT account_id, login, password, blocked, expired, groups FTOM account WHERE BINARY login=$_POST['login'] AND password=sha1($_POST['pass'])

3.
a) Jeżeli ilość zwróconych rekordów wynosi 0 -> nieudane logowanie
cool.gif Jeżeli ilość zwróconych rekordów wynosi 1:
- Jeżeli wartość blocked=1 -> konto zablokowane (oczywiście jakieś przekierowanie)
- Jeżeli wartość expired=1 -> ważność hasła wygasła (forwardowanie do akcji zmiany hasła)
c) Jeżeli brak przypadku b to jesteśmy zalogowani i:

4) Za pomocą explode() rozbijamy wartość groups na tablice i tworzymy zapytanie SQL wyciągające role z każdej grupy. Role wrzucamy do tablicy(po usunięciu ewentualnych powtórzeń), którą zapisujemy ją jako zmienną sesyjną.

Dotarłem do miejsca, w którym występują 2 problemy i chciałbym się poradzić Was o jakieś optymalne rozwiązanie.

Problem 1. Administrator kasuje grupę Handlowy. Jak się pozbyć z tabeli account wpisów tej grupy? Podaczas poprawnego zalogowania tworzyć tablicę nieistniejących grup i je kasować? Zastanawiam się jak bardzo może to obciążyć skrypt (rozważam dyżą aplikacje)
Problem 2. Jak zapisać zależności miedzy dostępnymi akcjami i wymaganymi uprawnieniami? Zapisywanie wymaganych uprawnień na stałe w kodzie mija się z celem. Dwie możliwość:
- baza (przy każdym wywołaniu akcji, kontroler wykonuje zapytanie do bazy aby sprawdzić jakie role potrzebne są do wykonania danej akcji.. Minus: kolejne zapytanie..
- Jakaś tablica asocjacyjna z takimi zależnościami.. Minus: Łatwa zmiana takiego pliku z configiem...


Pomysł z parametryzowaniem ról nawet mi się podoba. Struktura bazy nie zmieniłaby się, z tym że role byłyby zapisywane w ten sposób:
Kod
2        | Marketing       | Dział marketingu        | Role1(*):Role2(1,2,3), Role3(only_own)                          |


W tym przypadku pojawia się jeszcze jeden problem: Jak zdefiniować "podział" na sekcje do których taka rola (np. Role2(1,2,3) ) odwołuje się?


Mam nadzieje, że nie zamotałem za bardzo. Bardzo proszę o jakieś uwagi/pomysły..

Pozdrawiam
kukoc
co do problemu pierwszego
to tabele innodb maja taka opcje ustawiania klucza obcego
i jak poprawnie z tym kluczem polaczysz tablele
to wyrzucajac z glownej tabeli rekord o podanym id. z innych tabel tez leca rekordy ktore sie odwoluja do tego id. sorry nie podam ci przykladu bo juz zapomnialem smile.gif jak to sie robi

drugiego problemu nie rozumiem ale sam mam pytanie chyba krazoace w podobnej tematyce

mamy juz zaprojektowana ladna baze i mamy popisane funkcjie dla roznych czesci serwisu (addNews, createUser, sendMail i takie tam)

moje pytanie jest takie skad brac liste tych funkcji w momencie gdy ustawiamy uprawnienia dla nowej grupy. bo zakladam ze z pamieci sie nie bedzie wklepywac.

trzeba by je pogrupowac w moduly i umiescic w osobnej tablicy. tak zeby panel administracji potrafil odbudowac strukture strony z odpowiednil umiejscowieniem tych funkcji a admin dopisujacy uprawnienia tylko klikalby na checkboxy czy tam pola multiselect.

martwi mnie tylko fakt ze moj system bedzie sie rozwijac bez przerwy i beda powstawac nowe moduly i funkcje - wtedy bede musial je dopisywac do tej tabeli przy kazdej nowej aktualizacji.

bo druga opcja wydaje mi sie troche malo praktyczna : aby w momencie tworzenia nowych grup skrypt przeszukiwalby wszystkie pliki serwisu w poszukiwaniu istniejacych funkcji dostepu. to wogole jest jakas paranoja ale coz takie rzeczy tez przychodza do glowy...

jest jeszcze trzecia opcja ale ona juz wczesniej zostala odrzucona w tym temacie - stalych funkcji Add, Edit, Delete dla kazdego nowego modulu... bo to troche ogranicza (jest to dobre dla stalej struktury takiej jak forum) ale nie dla serwisu gdzie kazdy modul jest inny

jakis pomysl ?
Jarod
Cytat(kukoc @ 17.04.2007, 15:03:58 ) *
co do problemu pierwszego
to tabele innodb maja taka opcje ustawiania klucza obcego
i jak poprawnie z tym kluczem polaczysz tablele
to wyrzucajac z glownej tabeli rekord o podanym id. z innych tabel tez leca rekordy ktore sie odwoluja do tego id. sorry nie podam ci przykladu bo juz zapomnialem smile.gif jak to sie robi

Zapewne chodzi Ci o to http://dev.mysql.com/doc/refman/5.0/en/inn...onstraints.html
Ale mój problem nie polegał na tym. Podana struktura bazy wyżej jest nieprawidłowa (nie spełnia postaci 1NF) Za jakiąś godzinke wrzucę poprawną strukturę na której można oprzeć całą kontrole ACL.

Cytat(kukoc @ 17.04.2007, 15:03:58 ) *
drugiego problemu nie rozumiem ale sam mam pytanie chyba krazoace w podobnej tematyce

Chodzi o sprawdzanie czy akcja, którą chce odpalić dany użytkownik może zostać odpalaona czy nie (np nie ma uprawnień do wywołania tej akcji).

Cytat(kukoc @ 17.04.2007, 15:03:58 ) *
mamy juz zaprojektowana ladna baze i mamy popisane funkcjie dla roznych czesci serwisu (addNews, createUser, sendMail i takie tam)

moje pytanie jest takie skad brac liste tych funkcji w momencie gdy ustawiamy uprawnienia dla nowej grupy. bo zakladam ze z pamieci sie nie bedzie wklepywac.

Najlepiej stworzyć tabele z dostępnymi akcjami. Jak poczekasz chwilke to przeczytasz w następnum poście.


Cytat(kukoc @ 17.04.2007, 15:03:58 ) *
trzeba by je pogrupowac w moduly i umiescic w osobnej tablicy. tak zeby panel administracji potrafil odbudowac strukture strony z odpowiednil umiejscowieniem tych funkcji a admin dopisujacy uprawnienia tylko klikalby na checkboxy czy tam pola multiselect.

martwi mnie tylko fakt ze moj system bedzie sie rozwijac bez przerwy i beda powstawac nowe moduly i funkcje - wtedy bede musial je dopisywac do tej tabeli przy kazdej nowej aktualizacji.

bo druga opcja wydaje mi sie troche malo praktyczna : aby w momencie tworzenia nowych grup skrypt przeszukiwalby wszystkie pliki serwisu w poszukiwaniu istniejacych funkcji dostepu. to wogole jest jakas paranoja ale coz takie rzeczy tez przychodza do glowy...

jest jeszcze trzecia opcja ale ona juz wczesniej zostala odrzucona w tym temacie - stalych funkcji Add, Edit, Delete dla kazdego nowego modulu... bo to troche ogranicza (jest to dobre dla stalej struktury takiej jak forum) ale nie dla serwisu gdzie kazdy modul jest inny

jakis pomysl ?

tutaj to ładnie zamotałeś smile.gif nie wiem o co Ci tak naprawdę chodzi.
kukoc
Cytat
tutaj to ładnie zamotałeś nie wiem o co Ci tak naprawdę chodzi.


takie tam na goraco myslenie... nie wiem dlaczego ale dopiero jak komus zaczynam opisywac moj problem to zaczynam go rozumiec... glownie chodzilo mi o to ze bedzie potrzeba tablica z wszystkimi funkcjami tak jak napisales i sie utwierdzilem w tym.

wiecej nie pisze pocztekam do nowej wersji twoich tablic :]
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.