Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Organizacja danych przechowujących uprawnienia użytkowników, Projekt tabeli na potrzebę przechowywania praw użytkowników CMSa
Daiquiri
post
Post #1





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Witam,

Jestem w trakcie pisania CMSa, w którym ma znajdować się szerokie zróżnicowanie praw jakie posiadać będą użytkownicy. Administrator będzie miał możliwość nadawania bardzo szczegółowych "przywilejów", dla przykładu skrócona lista:
  • możliwość dodawania treści na stronę
  • możliwość edycji istniejącej treści
  • możliwość usuwania istniejących treści
  • wgląd w logi
  • zarządzanie reklamą
  • zarządzanie użytkownikami administracyjnymi
  • zarządzanie użytkownikami serwisu
  • zarządzanie kategoriami treści

Nie ma więc możliwości stworzenia domyślnych rang typu redaktor, moderator itd. Rozwiązanie (znane np. z Drupala) polegające na tworzeniu dowolnej rangi z konkretnymi przywilejami, a później przydzielanie jej użytkownikowi nie wchodzi w rachubę (ze względu na zlecającego). Całość ma wyglądać w następujący sposób: administrator startuje z tworzeniem nowego użytkownika (bądź edytuje istniejącego), podaje jego dane (nazwę, maila i tym podobne) i w tym miejscu ma listę praw (coś na kształt tej powyżej), zaznacza część z nich (wedle uznania) i tworzy użytkownika z konkretnymi przywilejami.

Zastanawiam się jednakże jak takie informacje przechowywać w bazie... być może zmęczenie materiału nie pozwala mi już "trzeźwo" myśleć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Rozważałam stworzenie tabeli z prawami do której przypisywany będzie użytkownik. Przykładowo kolumna opisana jako dodawanie treści na stronę a w wierszach klucze identyfikujące użytkowników. Nie mam jednak pewności co do tego na ile optymalne jest to rozwiązanie.

Być może ktoś już projektował podobne rozwiązanie i ma jakiś pomysł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
blooregard
post
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Ja rozwiązałem podobny problem następująco (w uproszczeniu):
Mam tabele 'perms', gdzie każdy rekord to ID uprawnienia i jego opis. Z kolei każda akcja w CMS-ie ma przyporządkowany ID konkretnego uprawnienia.
Druga tabela 'perm_to_user' łączy już konkretne uprawnienia z konkretnymi userami (jeden rekodr to relacja ID uprawnienia->ID usera).

W dodawaniu/edycji użytkownika mam formularz: checkbox+opis (zanzacenie checkboxa oznacza nadanie uprawnienia).

W konkretnej akcji jest f-cja checkPerm($perm_id, $user_id), która sprawdza, czy w tabeli 'perm_to_user' występuje rekodr zawierający ID uprawnienia oraz ID zalogowanego uzytkownika - jeśli tak, znaczy to, że dany użytkownik ma nadane prawa do tego modułu czy tam akcji. Jesli nie - żegnaj, Gienia.
Go to the top of the page
+Quote Post
progresmedia
post
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 1
Dołączył: 7.05.2009
Skąd: Wrocław

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


Ja bym to zrobił na jeden z dwóch sposobów:
- oddzielna tabela z rangami, czyli kolumna user_id i kolumna function, i później możesz selectem w prosty sposób sprawdzić kto co może
- kolumna w tabeli użytkowników pt. "prawa" i w niej ciąg funkcji które użytkownik może wykonywać, np. "edycja/usuwanie" i później również za pomocą SELECT (..) LIKE (..) możesz sprawdzić kto co może (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
omeck
post
Post #4





Grupa: Zarejestrowani
Postów: 79
Pomógł: 7
Dołączył: 2.07.2005
Skąd: Lublin

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


Cytat(progresmedia @ 7.07.2009, 18:57:49 ) *
Ja bym to zrobił na jeden z dwóch sposobów:
- oddzielna tabela z rangami, czyli kolumna user_id i kolumna function, i później możesz selectem w prosty sposób sprawdzić kto co może


Autor postu chyba nie może rozdzielić na rangi.

Szkoda, że nie możesz zrobić ACL z prawdziwego zdarzenia :-/ Czy nie najprościej i najszybciej byloby trzymać uprawnienia np. w pliczku ini:
Kod
[perms]
user1 = zasob1 zasob2 zasob3
user2 = zasob2 zasob4


Czyli definiować role (u Ciebie chyba nie może być rol, wiec tutaj trafialiby wszyscy uzytkownicy - niefajne) i przypisywać im identyfikatory zasobów.

Plusem jest na pewno to, że nie trzeba na poziomie bazy przy każdym request'ście sprawdzać uprawnień, a czytac z pliku (parse_ini_file" title="Zobacz w manualu PHP" target="_manual).

Ten post edytował omeck 7.07.2009, 19:23:15
Go to the top of the page
+Quote Post
Daiquiri
post
Post #5





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Najchętniej wykorzystałabym mechanizm budowania przez administratora rang z dowolnymi przywilejami... no ale nasz klient nasz pan.

Trzymanie wszystkiego w tabelach i odczytywanie poziomu dostępu "na życzenie" danego modułu jest dla mnie trochę słabe, ale z drugiej strony jak inaczej to przechowywać? Chyba zdecyduje się na trzymanie tego w tabeli z perms'ami (jak sugerował blooregard) z tym, że wczytam je jako zmienne sesji dla każdego użytkownika. Wtedy zapytanie wykona się raz, a konkretne funkcje odwołają się z pytaniem o pozwolenie do wartości tej zmiennej.

omeck - zastanawiałam się nad plikiem, ale sama nie wiem... myślę, że zmienne sesji załatwia mi problem wiecznych requestów do bazy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .

Dziękuję za podpowiedzi!
Go to the top of the page
+Quote Post
witul
post
Post #6





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 24.08.2007

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


A ja mam taki sposob. Mam tabelke przechowujaca wszystkie akcje systemu w postaci id=>link, np.
1=>'/administrator/article/editform',
2=>'/administrator/article/editsubmit'

Kazda publiczna metoda kontrolerów to akcja wpisana w ten sposob do tabelki.
Druga tabelka przechowuje nazwy operacji - dodawanie artykułów, edycja artykułów, usuwanie etc.
3 tabelka wiaze akcje z "operacja", przez co system wie ze ze edycja artykulow to akcje: /administrator/article/editform, /administrator/article/editsubmit.
Teraz mozemy przyznac userowi czy grupie userow uprawnienie nie do wykonywania konkretnych metod ale calych operacji, np edycji artykułów
Schematycznie tak to wygląda i nawet sie sprawdza.
Do tego widok w postaci tabelki z checkboxami przyznajace grupie uprawnienie do edycji artykulow

Uprawnienie sprawdza konstruktor klasy rodzica w kontrolerze
Wygodne i czytelne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował witul 11.07.2009, 03:10:08
Go to the top of the page
+Quote Post
AxZx
post
Post #7





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


rozwiązanie z pluginu sfguarduser do symfony:
  1. CREATE TABLE `sf_guard_group` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL,
  4. `description` text,
  5. PRIMARY KEY (`id`),
  6. UNIQUE KEY `sf_guard_group_U_1` (`name`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  8.  
  9. CREATE TABLE `sf_guard_group_permission` (
  10. `group_id` int(11) NOT NULL,
  11. `permission_id` int(11) NOT NULL,
  12. PRIMARY KEY (`group_id`,`permission_id`),
  13. KEY `sf_guard_group_permission_FI_2` (`permission_id`)
  14. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  15.  
  16. CREATE TABLE `sf_guard_permission` (
  17. `id` int(11) NOT NULL AUTO_INCREMENT,
  18. `name` varchar(255) NOT NULL,
  19. `description` text,
  20. PRIMARY KEY (`id`),
  21. UNIQUE KEY `sf_guard_permission_U_1` (`name`)
  22. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  23.  
  24. CREATE TABLE `sf_guard_user` (
  25. `id` int(11) NOT NULL AUTO_INCREMENT,
  26. `username` varchar(128) NOT NULL,
  27. `algorithm` varchar(128) NOT NULL DEFAULT 'sha1',
  28. `salt` varchar(128) NOT NULL,
  29. `password` varchar(128) NOT NULL,
  30. `created_at` datetime DEFAULT NULL,
  31. `last_login` datetime DEFAULT NULL,
  32. `is_active` tinyint(4) NOT NULL DEFAULT '1',
  33. `is_super_admin` tinyint(4) NOT NULL DEFAULT '0',
  34. PRIMARY KEY (`id`),
  35. UNIQUE KEY `sf_guard_user_U_1` (`username`)
  36. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  37.  
  38. CREATE TABLE `sf_guard_user_group` (
  39. `user_id` int(11) NOT NULL,
  40. `group_id` int(11) NOT NULL,
  41. PRIMARY KEY (`user_id`,`group_id`),
  42. KEY `sf_guard_user_group_FI_2` (`group_id`)
  43. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  44.  
  45. CREATE TABLE `sf_guard_user_permission` (
  46. `user_id` int(11) NOT NULL,
  47. `permission_id` int(11) NOT NULL,
  48. PRIMARY KEY (`user_id`,`permission_id`),
  49. KEY `sf_guard_user_permission_FI_2` (`permission_id`)
  50. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;


możesz przypisywać użytkowników do grup, a grupom nadawać uprawnienia. możesz również przypisać uprawnienie poszczególnym użytkownikom.
wg mnie to jest rozsądne i dobre rozwiązanie. nic dodać nic ująć:)

Ten post edytował AxZx 11.07.2009, 09:23:59
Go to the top of the page
+Quote Post

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: 24.12.2025 - 19:32