QN_fan
29.10.2006, 15:10:28
Zastanawiam się jak rozwiązać priorytety w systemie uprawnień.
Myślę w ten sposób, każdy moduł ma swoją tabelę z uprawnieniami dla poszczególnych użytkowników / grup (w jednej). W ten sposób żeby wszystko mogło działać niezależnie i teraz możemy nadawać uprawnienia bezpośrednio dla użytkownika lub dla grupy, z tym że uprawnienia użytkownika mają największy priorytet, to znaczy przysłaniają uprawnienia grupy - chociaż nie wiem czy to dobre wyjście. Teraz tylko zastanawiam się jak rozwiązać sytuację gdy użytkownik należy do kilku grup o różnych uprawnieniach. Czy w pliku konfiguracyjnym modułów określić w jaki sposób mają być nadpisywane? Może tak da się też rozwiązać ewentualną sytuację nadpisywania uprawnień użytkownika przez uprawnienia grupy... przykładowo gdy z normalnego redaktora newsów który do tej pory mógł dodawać newsy i edytować tylko swoje robimy moderatora dodając go do odpowiedniej grupy chcielibyśmy nadpisać uprawnienia użytkownika. Tutaj kolejne pytanie, lepiej je nadpisać czy tylko przysłonić podczas ładowania?
Nie mam na myślę prostych uprawnień typu: admin - może wszystko i użytkownik - może to co inni; myślę o bardziej szczegółowych.
Macie jakieś pomysły?
Cysiaczek
29.10.2006, 16:29:33
Według mnie to jest dobry pomysł. Jest maksymalnie elastyczny, Problemem jest jedynie proces usuwania użytkownika z systemu. W każdym module/contencie będzie trzeba usunąć osobno, co przy dużym serwisie może trochę potrwać, a niekiedy może powodować błędy (np. przerwane działanie skryptu etc). Również zmiana uprawnień niesie konieczność aktualizacji dużej liczby tabel/wierszy w bazie.
Problem z obecnością w wielu grupach nie jest dużym problemem - po prostu musisz przyjąć zasadę, że jeśli ktoś/coś nadało użytkownikowi w jednej grupie uprawnienie do np., zmiany treści newsa, to nie ważne, że jako członek drugiej grupy tych uprawnień nie ma. Powinieneś rozstrzygać na korzyść użytkownika, chyba, że Twój system zakłada zabranianie czegoś.
Pozdrawiam.
QN_fan
29.10.2006, 17:48:38
Faktycznie usuwanie może stanowić swojego rodzaju problem, ale może rozwiążę to na zasadzie okresowego czyszczenia bazy np. przez crona, albo pierwszą wizytę Admina każdego miesiąca, albo będę indeksował kolejne moduły i przy usuwaniu po prostu każdy się odwiedzi.
Z zasadą o której mówisz też nie jest tak prosto, bo przykładowo do edycji artykułu są takie możliwości:
0 - nie można edytować
1- można edytować wszystkie
2 - można edytować swoje
3 - można edytować swojej grupy (moderator grupy)
No i teraz jedna grupa ma 1 a druga 3... W tym wypadku można by ułożyć je tak że np. te o wyższej wartości są przysłaniane przez te o niższej, ale nie wszędzie to załatwi problem, np. do podglądania ustawień osobistych:
0 - nie może
1- wszystkie
2 - tylko w swojej grupie
tutaj nie można przysłaniać bo wszystkie są potrzebne oddzielnie, a np. edycja recenzji artykułów:
0 - nie można
1 - można tylko swoich artykułów
2 - tylko artykułów grupy w której jestem modem
3 - wszystkich grup do których należę
4 - wszystkich recenzji
'username' - tylko tego użytkownika
No i w takim wypadku kolejny problem... bo albo trzeba pamiętać wszystkie uprawnienia wynikające z przynależności do kolejnych grup, no i ewentualnie dodatkowo ustawić że uprawnienie "4" nadpisuje wszystkie. Tylko kolejna sprawa jest taka że uprawnienie "3" może np. pojawić się w uprawnieniach użytkownika (nie grupy) a chcieli byśmy jedna żeby w jednej ze swoich grup go nie miał, więc zasłonienie nie bardzo jest wskazane. Wtedy np. ustawiamy że to uprawnienie ma większy priorytet niż uprawnienia użytkownika.
Trochę to zagmatwane, myślałem że ktoś już miał podobny problem.
Czy nie lepiej stworzyć coś na kształt praw dostępu, jakie funkcjonują pod uniksami? prawo do odczytu, zapisu i wykonania dla usera, grupy i wszystkich.
user należy do wielu grup, tworząc dany obiekt, artykuł, rekord, czy cokolwiek innego, wybiera prawa dostępu, grupę, która będzie właścicielem, ustawia odpowiednie prawa dostępu i wskazane grupy mogą/niemogą edytować/czytać/wykonać. Domyślnie oczywiście root ma wszędzie 777, czyli wszędzie może zrobić wszystko, ale na codzień chyba nie korzysta się z praw roota nigdzie, prawda?
QN_fan
30.10.2006, 00:35:45
PdM, niestety to nie załatwia sprawy, jest to zbyt uogólnione.
ARJ, nie w tym rzecz. Ogólnie chodzi o to np. co zrobić kiedy dwie grupy mają uprawnienia (jakieś) do danego modulu, co wtedy zrobic, kiedy nie mozna podzielic ich na ważniejsze i mniej ważne? Np. user ma prawo edycji swoich artow, nalezy do trzech grup, jedna grupa moze edytowac swoje arty pozotale nie. No i teraz chcialbym zeby w jednej z tych pozostalych mimo wszystko mogl a w drugiej nie.
tak na przyklad.
Wniosek taki, że potrzebujesz systemu praw zbliżonych do tych na phpBB... Niezły burdel tam się tworzy... Jedyną zasadą, która w tym wypadku powinna być brana pod uwagę to zasada: prawo zezwolenia jest wyższe od prawa zakazu.
Uwaga o działaniach na bitach powinna ci się przydać, bo jest to chyba najszybszy sposób rozstrzygania, czy dana wartość się zawiera w zmiennej.
Swoją drogą, to to co wykombinowałeś, całkiem skomplikowane jest i może być trudne do napisania
QN_fan
30.10.2006, 14:38:06
Pokombinuje
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.