Apa model dasar untuk membuat database dengan pengguna dan grup?

9

Saya mencoba mencari cara terbaik untuk sistem keamanan dasar untuk situs web. Saya tahu saya ingin pengguna dan grup.

Saya pikir saya akan:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

Yang pertama adalah pengguna, yang kedua adalah grup, dan yang ketiga adalah tabel perantara yang menghubungkan keduanya. Satu pengguna memiliki banyak grup.

Apakah ini terdengar ok?

johnny
sumber
Selain namanya. GROUP_TYPETabel Anda harus dinamai GROUPatau yang serupa, dan Anda GROUP_TABLEharus mereferensikan Pengguna dan Grup, karena itulah yang tertaut.
Adam Musch
@adam tidak group_table melakukan itu dengan user_id dan group_id?
johnny
4
@AdamMusch Tidak boleh bernama GROUP, karena itu kata yang dilindungi undang-undang. Tabel dan kolom tidak boleh dinamai dengan kata
Philᵀᴹ
1
@Phil setuju. Anda juga dapat memberi nama tabel SELECTdan bidang FROMsehingga Anda dapat memiliki pertanyaan sepertiSELECT [FROM] FROM [SELECT]
JNK
2
Coba panggil entitas dasar sesuatu seperti 'app_user' dan 'app_role'
ConcernedOfTunbridgeWells

Jawaban:

17

Cara tradisional untuk memodelkan ini adalah menggunakan pola yang disebut Keamanan Berbasis Peran .

Idenya bukan hanya untuk memiliki kelompok pengguna, tetapi juga kelompok izin. Berikut adalah bagaimana polanya terlihat:

ERD Security Berbasis Peran

Perhatikan bahwa Anda ingin menghindari kata-kata yang dicadangkan untuk nama tabel, jadi jangan beri nama tabel Anda persis seperti yang ditunjukkan pada diagram.

Cara kerjanya adalah bahwa grup atau Peran Anda tidak hanya memiliki daftar pengguna yang ditugaskan kepada mereka tetapi juga daftar izin yang diberikan kepada mereka. Hal ini memungkinkan Anda untuk mengatur drive yang dapat melakukan apa, tetapi juga apa yang dapat mereka lakukan, jika Anda mengikuti saya.

Joel Brown
sumber
Tetapi bagaimana jika pengguna saya memiliki beberapa peran seperti manajer atau apa pun dan karena alasan tertentu pengguna yang sama juga memerlukan satu izin khusus (yang tidak dalam peran itu, juga tidak dalam peran lain apa pun)?
levi
@levi - Jika itu terjadi maka salah satu cara untuk mengatasinya adalah dengan membuat peran khusus seperti "Izin Khusus Bob" , yang merupakan sedikit masalah, tetapi itu menyelesaikan masalah selama Anda tidak memiliki terlalu banyak pengecualian seperti ini. Ada kemungkinan bahwa apa yang Anda anggap sebagai pengecualian individu sebenarnya bisa menjadi peran baru yang halus yang belum Anda pertimbangkan. Apa yang terjadi ketika Bob berhenti? Apakah pengganti Bob juga memerlukan izin khusus? Jika demikian maka Anda benar-benar memiliki peran dengan satu anggota, tidak terkecuali.
Joel Brown
@levi - Kemungkinan lain adalah Anda benar-benar perlu memiliki campuran hak individu dan peran. Dalam hal ini, ROLEtabel Anda dapat subtipe ke tipe Individu dan Grup , di mana tipe grup memiliki nol untuk banyak anggota dan tipe individu memiliki tepat satu anggota. Bagaimana Anda menegakkan aturan kardinalitas ini terserah Anda. Ini bisa dilakukan secara deklaratif dalam skema database Anda, dalam hal ini Anda perlu mengubah skema gambar sedikit. Atau Anda mungkin menggunakan logika aplikasi, dalam hal ini skema Anda masih terlihat seperti apa yang saya gambar di atas.
Joel Brown