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ść |
-------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------------------------------
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 |
--------------------------------------------
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":
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

- 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