Saya memiliki model database dengan tabel pengguna dan tabel peran. Saya ingin mengontrol akses (hak) hingga 10 elemen yang berbeda. Akses dapat diberikan ke peran atau pengguna tunggal. Di bawah ini adalah definisi tabel pengguna, peran dan item:
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,
...
);
...
Sekarang saya memiliki dua cara berbeda dalam mendesain hak. Satu tabel dengan kolom jenis hak atau 10 tabel hak - satu untuk setiap elemen yang ingin saya kontrol aksesnya.
Apa pro dan kontra dari satu tabel hak vs satu tabel hak per elemen? - atau apakah cara yang lebih cocok untuk melakukan ini?
database-design
best-practices
taudorf
sumber
sumber
Jawaban:
Pertama-tama, jenis model keamanan apa yang Anda rencanakan untuk implementasikan? Kontrol Akses Berbasis Peran (RBAC) atau Discretionary Access Control (DAC)?
lihat sumber
1) Di RBAC: Anda perlu tabel ElementType untuk menetapkan hak atas peran (pengguna ditugaskan ke peran) RBAC mendefinisikan: "Apa yang bisa dilakukan peran / pengguna ini". Administrator memberikan hak untuk peran dan izin ke peran, menetapkan pengguna ke peran untuk mengakses sumber daya. 2) Di DAC: pengguna dan peran memiliki hak atas elemen melalui daftar kontrol akses (kepemilikan). DAC mendefinisikan: "siapa yang memiliki akses ke data saya". Pengguna (pemilik) memberikan izin ke sumber daya yang dimiliki.
Cara saya menyarankan model data ini:
(hubungan satu lawan satu)
1) RBAC (hubungan banyak ke banyak)
2) DAC (hubungan banyak ke banyak)
sumber
Dengan tabel hak untuk setiap elemen, segera setelah Anda menambahkan elemen, Anda perlu menambahkan tabel. Ini akan menambah pemeliharaan aplikasi.
Kelemahan dari menempatkan segala sesuatu dalam satu tabel adalah bahwa Anda mungkin mengalami masalah penskalaan, tetapi hal itu dapat dikurangi dengan menggunakan partisi, pandangan terwujud, dan / atau kolom virtual. Kemungkinan tindakan seperti itu tidak perlu dilakukan.
Sejauh desain tabel, jika ini pada Oracle saya mungkin menyarankan sesuatu seperti ini:
Kode paket bisa menggunakan urutan UserRoleID untuk mengisi Id di tabel Users dan Id di tabel Roles yang diperlukan. Tabel Izin kemudian dapat memiliki elemen yang ditugaskan untuk peran yang pada gilirannya ditugaskan untuk pengguna dan / atau memiliki elemen yang ditugaskan langsung ke pengguna.
sumber