2013-04-11 40 views
7

Próbuję znaleźć rozwiązanie tego problemu przez kilka dni i po prostu nie mogę wymyślić czegoś, co działa. Problem jest następujący:Schemat bazy danych MySQL do kontroli dostępu użytkownika i grupy

Obecnie rozwijam narzędzie statystyczne, które pokazuje niektóre wykresy i dane dla kilku aplikacji. Dostęp do tych danych oczywiście musi być ograniczony, ponieważ użytkownik A posiada aplikacje "jeden" i "dwa" i nie może zobaczyć "trzy" lub "cztery".

Teraz każdy użytkownik może być członkiem wielu grup i dziedziczyć uprawnienia z tej grupy, ale może również mieć indywidualne uprawnienia. Te uprawnienia muszą być ustawione dla każdej aplikacji. Dostęp do zbioru danych z jednej aplikacji jest udzielane, jeżeli:

  • Użytkownik sam ma dostępu do tej części danych tej aplikacji
  • Każda z grup, których użytkownik jest członkiem ma pozwolenie aby uzyskać dostęp do tej części danych tej aplikacji

http://i.stack.imgur.com/y4W6E.png

celem jest mieć tabeli, który przechowuje aktualne uprawnienia każdy użytkownik ma obecnie do każdego zastosowania, liczonego od członkostwa grupa i ja indywidualne uprawnienia i zawsze są one spójne ze względu na relacje z innymi tabelami.

Nie wiem, czy to pomaga znaleźć rozwiązanie, ale tutaj jest SQL, aby uzyskać aktualnie aktywne uprawnienia użytkownika o identyfikatorze 1:

(
SELECT u.perm_id AS perm, u.user_id AS uid, u.app_id AS app 
FROM daUsers_has_daPermissions AS u 
WHERE u.user_id = 1 
) 
UNION 
(
SELECT g.perm_id AS perm, u.user_id AS uid, g.app_id AS app 
FROM daUsers_has_daPermissions AS u, daUsergroup_has_daPermissions AS g, daUsergroup_has_daUsers AS g_has_u 
WHERE u.user_id = 1 
AND u.user_id = g_has_u.user_id 
AND g.group_id = g_has_u.group_id 
); 

To jest to, co chcę, aby przechowywać w sposób dodatkowa stolik (tylko dla wszystkich użytkowników).

Odpowiedz

3

Brzmi dla mnie, powinieneś użyć widoku. Masz już zapytanie, użyj zapytania, aby utworzyć widok.

+0

Dzięki za podpowiedź, nawet nie wiedziałem, jaki widok był do tej pory. Zrobię to na razie, ale to nie * tak naprawdę * rozwiązuje mój problem, ponieważ widok zbiera również wszystkie dane z każdej odpowiedniej tabeli za każdym razem, gdy ktoś żąda od niej danych, czego właśnie chcę uniknąć . Chcę przechowywać te informacje w tabeli, a ** tylko ** aktualizować je, jeśli faktycznie są zmiany w coś, co wpływa na uprawnienia (takie jak usuwana grupa). – Anpan

+0

Następnie możesz użyć wyzwalaczy. [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html). Gdy tabela jest aktualizowana, co wpływa na uprawnienia. Ustaw wyzwalacz, aby zaktualizować tabelę, w której przechowywane są wszystkie uprawnienia. –

+0

Potrzebny jest widok zmaterializowany, który jest funkcją, która nie istnieje w MySQL. Ale tak, możesz [symulować jeden] (http://www.fromdual.com/mysql-materialized-views), definiując nową tabelę i używając wyzwalaczy, aby upewnić się, że jest dokładnie wypełniony. –