Mám databázový model s uživatelskou tabulkou a tabulkou rolí. Chci řídit přístup (práva) až k 10 různým prvkům. Přístup lze udělit buď roli, nebo jedinému uživateli. Níže je uvedena tabulka definice uživatelů, rolí a položek:
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,
...
);
...
Nyní mám dva různé způsoby navrhování práv. Jedna tabulka se sloupcem typu práv nebo 10 tabulek práv - jedna pro každý prvek, ke kterému chci řídit přístup.
Jaké jsou výhody a nevýhody jedné tabulky práv vs. jedné tabulky práv na prvek? - nebo je to vhodnější způsob?
Za prvé, jaký typ modelu zabezpečení plánujete implementovat? Řízení přístupu založené na rolích (RBAC) nebo diskrétní řízení přístupu (DAC)?
RBAC v modelu RBAC (Access Based Based Control) je přístup k prostředkům založen na roli přiřazené uživateli. V tomto modelu administrátor přiřadí uživatele roli, která má určitá předdefinovaná práva a oprávnění. Z důvodu přidružení uživatele k roli může uživatel přistupovat k určitým prostředkům a provádět specifické úkoly. RBAC je také známý jako nediskreční řízení přístupu. Role přiřazené uživatelům jsou centrálně spravovány.
DAC V modelu diskrétního řízení přístupu (DAC) je přístup k prostředkům založen na totožnosti uživatele. Uživateli je uděleno oprávnění ke zdroji umístěním na seznam řízení přístupu (ACL) spojený s prostředkem. Položka na ACL zdroje je známá jako položka ACE (Access Control Entry). Pokud je uživatel (nebo skupina) vlastníkem objektu v modelu DAC, může uživatel udělit oprávnění ostatním uživatelům a skupinám. Model DAC je založen na vlastnictví zdrojů.
1) V RBAC: k přiřazení práv k roli potřebujete tabulku ElementType (uživatelé jsou přiřazeni k rolím). RBAC definuje: „Co může tato role/uživatel dělat“. Správce přiřadí práva pro role a oprávnění k rolím, přiřadí uživatele k rolím pro přístup k prostředkům. 2) V DAC: uživatelé a role mají práva na prvky prostřednictvím seznamu řízení přístupu (vlastnictví). DAC definuje: „kdo má přístup k mým údajům“. Uživatel (vlastník) uděluje oprávnění pro vlastněný zdroj.
Jakkoli navrhuji tento datový model:
CREATE TABLE ElementType
(
Id (PK)
Name
...
)
CREATE TABLE ElementBase
(
Id (PK)
Type (FK to ElementType)
...
)
(vztah jeden k jednomu)
CREATE TABLE Element_A
(
Id (PK, FK to ElementBase)
...
)
CREATE TABLE Element_B
(
Id (PK, FK to ElementBase)
...
)
1) RBAC (vztah mnoho k mnoha)
CREATE TABLE ElementType_To_Role_Rights
(
RightId (PK)
RoleId (FK to Role)
ElementTypeId (FK to ElementType)
...
)
2) DAC (vztah mnoho k mnoha)
CREATE TABLE ElementBase_To_Actor_Rights
(
RightId (PK)
ElementBaseId (FK to ElementBase)
ActorId (FK to Actor)
...
)
CREATE TABLE Actor
(
Id (PK)
Name
)
CREATE TABLE User
(
Id (PK, FK to Actor)
Password
...
)
CREATE TABLE Role
(
Id (PK, FK to Actor)
...
)
S tabulkou práv pro každý prvek, jakmile přidáte prvek, budete muset přidat tabulku. To by přispělo k údržbě aplikace.
Nevýhodou umístění všeho v jedné tabulce je to, že se můžete setkat s problémy s škálováním, ale ty lze zmírnit pomocí rozdělení, materializovaných pohledů nebo virtuálních sloupců. Pravděpodobně by taková opatření nebyla nutná.
Pokud jde o design stolu, pokud by to bylo na Oracle, mohl bych navrhnout něco takového:
CREATE SEQUENCE UserRoleID;
CREATE TABLE USERROLE
(
USERID NUMBER(7) NOT NULL
, ROLEID NUMBER(7) NOT NULL
, CONSTRAINT USERROLE_PK PRIMARY KEY
(
USERID
, ROLEID
)
ENABLE
)
ORGANIZATION INDEX;
CREATE TABLE PERMISSIONS
(
ID NUMBER(7) NOT NULL
, ELEMENTID NUMBER(7) NOT NULL
, CONSTRAINT USERROLE_PK PRIMARY KEY
(
ID
, ELEMENTID
)
ENABLE
)
ORGANIZATION INDEX;
Kód balíčku by mohl podle potřeby použít posloupnost UserRoleID k naplnění ID v tabulce Users a Id v tabulce Roles. Tabulka oprávnění by pak mohla mít prvky přiřazené k rolím, které jsou zase přiřazeny uživatelům nebo mohou mít prvky přiřazené přímo uživatelům.