Mam model bazy danych z tabelą użytkowników i tabelą ról. Chcę kontrolować dostęp (prawa) do 10 różnych elementów. Dostęp może zostać przyznany roli lub pojedynczemu użytkownikowi. Poniżej znajduje się definicja tabeli użytkowników, ról i elementów:
CREATE TABLE users
(
id serial NOT NULL PRIMARY KEY,
username character varying UNIQUE,
password character varying,
first_name character varying,
last_name character varying,
...
);
CREATE TABLE roles
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
CREATE TABLE element_1
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
...
Teraz mam dwa różne sposoby projektowania praw. Jedna tabela z kolumną typu uprawnień lub 10 tabel uprawnień - po jednym dla każdego elementu, do którego chcę kontrolować dostęp.
Jakie są zalety i wady jednej tabeli uprawnień w porównaniu do jednej tabeli uprawnień na element? - czy jest to bardziej odpowiedni sposób na zrobienie tego?
database-design
best-practices
taudorf
źródło
źródło
Odpowiedzi:
Po pierwsze, jaki typ modelu bezpieczeństwa planujesz wdrożyć? Kontrola dostępu oparta na rolach (RBAC) czy dyskrecjonalna kontrola dostępu (DAC)?
patrz źródło
1) W RBAC: potrzebujesz tabeli ElementType, aby przypisać prawa do roli (użytkownicy są przypisani do ról). RBAC definiuje: „Co może zrobić ta rola / użytkownik”. Administrator przypisuje prawa do ról i uprawnienia do ról, przypisuje użytkowników do ról w celu uzyskania dostępu do zasobów. 2) W DAC: użytkownicy i role mają prawa do elementów poprzez listę kontroli dostępu (własność). DAC definiuje: „kto ma dostęp do moich danych”. Użytkownik (właściciel) przyznaje uprawnienia do posiadanego zasobu.
W dowolny sposób sugeruję ten model danych:
(relacja jeden do jednego)
1) RBAC (relacja wiele do wielu)
2) DAC (relacja wiele do wielu)
źródło
Z tabelą praw dla każdego elementu, jak tylko dodasz element, będziesz musiał dodać tabelę. Zwiększy to utrzymanie aplikacji.
Minusem umieszczania wszystkiego w jednej tabeli jest to, że możesz napotkać problemy ze skalowaniem, ale można je złagodzić za pomocą partycjonowania, zmaterializowanych widoków i / lub wirtualnych kolumn. Prawdopodobnie takie środki nie byłyby konieczne.
Jeśli chodzi o projekt tabeli, gdyby to było na Oracle, mógłbym zasugerować coś takiego:
Kod pakietu może w razie potrzeby użyć sekwencji UserRoleID, aby wypełnić identyfikator w tabeli Users i identyfikator w tabeli Roles. W tabeli Uprawnienia można następnie przypisać elementy do ról, które z kolei są przypisane do użytkowników i / lub mają elementy przypisane bezpośrednio do użytkowników.
źródło