2012-04-25 25 views
6

Zajmuję się tworzeniem aplikacji dla naszej firmy, która ostatecznie będzie miała wiele sposobów ograniczania użytkowników do poszczególnych sekcji/modułów. Mimo że aplikacja jest wciąż niewielka, chciałbym przejść do nowej metody przechowywania uprawnień, która w miarę wzrostu aplikacji pozostanie łatwa do utrzymania i zapytania.Przechowywanie pozwoleń na aplikacje w bazie danych

Obecnie w naszej bazie danych MySQL znajduje się tabela o nazwie "użytkownik", która przechowuje identyfikator użytkownika, nazwę użytkownika i hasło. W osobnej tabeli o nazwie „user_acl” jest następujący:

user_acl_id 
acl_root 
acl_news_read 
acl_news_write 
acl_news_modify 
acl_reports_read 
acl_reports_write 
acl_reports_modify 
acl_users_read 
acl_users_write 
acl_users_modify 

Mamy tylko 3 moduły w tej chwili, ale z biegiem czasu bardziej zostanie utworzona i uprawnienia dla każdego będą musiały być dodane.

Zamiast tworzyć kolumny dla każdego pozwolenia, czy istnieje inny sposób przechowywania tych informacji?

Odpowiedz

24

Zrobiłbym to w ten sposób.

table name: permission 
columns: id, permission_name 

i wtedy mogę przypisać wiele uprawnień dla użytkownika przy użyciu wiele do wielu tabeli relacji

table name: user_permission 
columns: permission_id, user_id 

Ten projekt pozwoli mi dodać tyle pozwolenie, jak chcę, i przypisać ją jako wielu użytkowników, jak chcę.

Chociaż powyższy projekt spełnia twoje wymagania, mam własną metodę implementacji ACL w mojej aplikacji. Zamieszczam to tutaj.

Moja metoda realizacji ACL idzie tak:

  1. Użytkownik zostanie przypisana rola (Admin, gość, pracowników, społeczeństwa)
  2. Rola będzie mieć jeden lub wiele uprawnienia przypisane im (user_write, user_modify, report_read) itd.
  3. Pozwolenie dla użytkownika zostanie dziedziczone z roli, do której jest on/ona
  4. Użytkownik może być przypisany z ręcznym pozwoleniem, niezależnie od uprawnienia odziedziczonego z roli.

Aby to zrobić, opracowałem następujący projekt bazy danych.

role 
I store the role name here 
+----------+ 
| Field | 
+----------+ 
| id  | 
| roleName | 
+----------+ 

permission: 
I store the permission name and key here 
Permission name is for displaying to user. 
Permission key is for determining the permission. 
+----------------+ 
| Field   | 
+----------------+ 
| id    | 
| permissionName | 
| permissionKey | 
+----------------+ 

role_permission 
I assign permission to role here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| role_id  | 
| permission_id | 
+---------------+ 

user_role 
I assign role to the user here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| user_id  | 
| role_id  | 
+---------------+ 

user_permission 
I store the manual permission I may allow for the user here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| user_id  | 
| permission_id | 
+---------------+ 

Daje mi to większą kontrolę nad listą ACL. Mogę pozwolić superadminom na samodzielne przydzielanie uprawnień i tak dalej. Jak już powiedziałem, to tylko po to, aby dać ci pomysł.

+0

Jak dodać dodatkowe informacje o roli, takie jak admin public etc? na przykład administrator ma coś więcej do dodania jak nazwa firmy .. a użytkownik nie ma tego pola? – james

+0

Chciałbym przechowywać informacje w pokrewnym obiekcie, możesz dodać dodatkowe kolumny do tabeli, jeśli chcesz dodać więcej informacji do roli, możesz dodać dodatkową kolumnę w tabeli ról, to samo dotyczy tabeli użytkowników –

+0

, jeśli mam tabelę użytkowników z polami nazwa użytkownika i hasło., które jest ogólne dla wszystkich użytkowników. i mam tabelę członków z dodatkowym polem, takim jak nazwa firmy, adres itp. Również mam administratora z kilkoma dodatkowymi informacjami. Czy muszę używać relacji supertype/subtype dla użytkownika z adminem memebers? – james

0

Uważam, że należy wprowadzić te uprawnienia w formacie jSON.

Można utworzyć kolejną tabelę z uprawnieniami, gdzie można dodawać, modyfikować, usuwać wiersze w dowolnym momencie.

lub

każdym razem, gdy użytkownik uwierzytelnia można przechowywać te uprawnienia w sesji i przekazać je do swoich skryptów.

Moja osobista sugestia jest pierwszą opcją.

0

Tak jak mówi Ibrahim, utwórz nową tabelę specjalnie dla twoich uprawnień.Przypisz wartość liczbową do użytkownika, który reprezentuje jego poziom uprawnień, powiedz 1 = odczyt, 2 = zapis/odczyt, 3 = modyfikacja/zapis/odczyt. Następnie w kodzie sprawdź odpowiedni poziom uprawnień, zanim zezwolisz użytkownikowi na wykonanie określonego zadania. Jeśli nie mają wymaganej wartości (3 do modyfikacji lub> = 2 do zapisu), blokujesz tę zdolność.

0

myślę, że należy mieć fave tabele:

user 
user_x_profile 
profile 
profile_x_function 
function 

skonfigurować różne „rodzajowe” profile „widza”, „pracownik”, „Menedżer” itd

możliwość skonfigurowania funkcji” "wpis dla każdego obiektu, który chcesz kontrolować.

Następnie połącz funkcje z profilami w funkcji profil_x_.

Następnie przypisz jeden lub więcej profili każdemu użytkownikowi.

To ogranicza wysiłek administracyjny. Załóżmy, że chcesz dodać kolejną funkcję, której mogą używać tylko "menedżerowie" - wystarczy dodać nowy wpis do tabeli funkcji, a następnie dodać wpis w tabeli "profile_x_function", który łączy się z profilem "menedżera" z uprawnieniem do profilu menedżera i jest dostępna dla wszystkich menedżerów.

Aby uzyskać dostęp do kwerendy, potrzebne będzie pięć dołączeń tabel, ale wybierasz tylko jeden atrybut zezwolenia.

Powiązane problemy