Autor wpisu: cojack, dodany: 22.01.2010 10:41, tagi: php
Tak więc w poprzednim wpisie, pokazałem w jaki sposób zaimplementować taką strukturę w sql, w tym wpisie chciałbym rozważyć pewne dodatkowe możliwości, które mogą chodź nie muszą okazać się przydatne w cale. A więc, mamy tutaj sprawdzanie uprawnień tylko i wyłącznie dla grup użytkowników. Co nie było naszym założeniem, więc by kontynuować i rozszerzyć możliwości naszego rbac’a należy wprowadzić pewne zmiany. Tabela rbac_privilages powinna zostać przemianowana na rbac_group_privilages, musimy też utworzyć drugą tabelę rbac_user_privilages o podobnej strukturze jak ta poprzednia. Taka zmiana pozwoli nam już dodawać indywidualne uprawnienia dla użytkowników. Z założeń pozostało nam jeszcze grupa do grup zadań czyli naszych controllerów, oraz użytkownik do grupy zadań. Jakby nie patrzeć są to dodatkowe dwie tabele, których utworzenie nie powinno przysporzyć większych problemów.
Logika struktury sql
Można by się zapytać po co tyle tabel? A bardzo chętnie na to pytanie odpowiem, otóż baza danych nie jest stworzona po to by trzymać w niej to co się chce i nawet bez sensu, takie rzeczy dyskryminują nas od razu w oczach pracodawcy. Więc dane nie powinny się powtarzać, kolumny powinny być tak tworzone by zawierały jak najmniej wartości NULL chyba że ma to pewien sens. Coś na zasadzie “Dziel i zwyciężaj” tylko tutaj prawda nie mamy żadnych algorytmów
Priorytety w Role Based Access Control
Mamy taki problem: Czy pobrać wszystko za jednym zamachem i sprawdzać dostęp za pomocą tego co mamy, czy sprawdzać pobierając dane po kolei? I odpowiedź bez sprawdzenia tego, które z założeń jest szybsze jest chyba absurdem, niestety nie mam na razie na to czasu by to sprawdzić, lecz chciałbym ustalić kolejność priorytetów. Założenie jest takie: Każdy użytkownik jest przypisany do jakiejś grupy, użytkownik bez grupy też jest w grupie użytkowników a mowa tutaj o osobach które nie są zarejestrowane na naszej stronie, można przyjąć ich za grupę Guest, czyli gości. Taki paradoks. I teraz priorytety wg mnie można by ustalić w ten sposób:
- Sprawdzanie czy grupa ma dostęp do controllera, czyli naszej grupy zadań.
- Ma, sprawdzamy czy grupa ma dostęp do akcji w kontrolerze, czyli naszego zadania
- Ma, zezwalamy
- Nie ma, przechodzimy do pkt 2
- Nie ma, przechodzimy do pkt 2
- Ma, sprawdzamy czy grupa ma dostęp do akcji w kontrolerze, czyli naszego zadania
- Grupa nie ma uprawnień do zadania w controllerze, sprawdzamy czy użytkownik ma dostęp do controllera
- Ma, sprawdzamy czy ma dostęp do akcji w kontrolerze
- Ma, zezwalamy
- Nie ma, odmawiamy
- Nie ma, odmawiamy
- Ma, sprawdzamy czy ma dostęp do akcji w kontrolerze
- Amen
Hierarchia, czyli dziedziczenie uprawnień
Szczerze jak sobie pomyślę o takim założeniu to zaczyna mnie głowa boleć, bo już sobie w głowie tworzę taką aplikację w sql która musi to sprawdzać, no daję głowę, szczęka opada… Więc nie wiem czy aby na pewno jest to słuszne by tworzyć to, ale słowo się rzekło, to i się to napisze. Tylko obawiam się że bez rekurencji to nie przejdzie, chociaż nie jestem tego jeszcze do końca pewien, być może nie będzie tak źle na jak to wygląda. Dodatkowe akcje wchodzą w grę, należy sprawdzać czy jeżeli np grupa nie ma uprawnień do akcji, czy nad grupa ma pozwolenie na tą akcję oraz czy pozwala ją dziedziczyć, gdyby ktoś wyjechał z pomysłem komu pozwala ją dziedziczyć to w ogóle jeszcze więcej roboty, więc proszę nie dobijać leżącego Huh chociaż dobrze że nie ma sensu robić hierarchie użytkowników, bo od tego jest rbac właśnie by zrobił to za nas.
Słów kilka na zakończenie
Myślę że jest to optymalne sprawdzanie, chyba że coś pominąłem to mnie poprawcie, trochę z rana mogę być jeszcze nie ogarnięty z wszystkim, więc pisać w komentarzach co i jak.