Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kontrola dostępu - część II., Kontynuacja wątku z archiwum PRO
Jarod
post
Post #1





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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
(IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował Jarod 9.04.2007, 13:43:10
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 20:08