Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Panduan Merancang Database Untuk RBAC Di MySQL

Tutorial ini memberikan langkah-langkah lengkap untuk merancang skema database sistem Kontrol Akses Berbasis Peran (RBAC) untuk mengelola pengguna, peran, dan izin. Ini dapat digunakan lebih lanjut untuk memutuskan akses ke sumber daya tertentu berdasarkan izin tertentu. Menggunakan sistem RBAC harus dianggap sebagai bagian integral dari aplikasi apa pun yang berbagi sumber daya di antara banyak pengguna. Misalnya. karyawan organisasi dapat mengakses atau mengelola produk berdasarkan izin yang diberikan kepada mereka. Idealnya, izin dapat diberikan melalui peran.

Diagram Hubungan Entitas atau desain basis data visual ditunjukkan di bawah ini.

Gambar 1

Catatan :Tabel peran dan izin yang dibahas dalam tutorial ini dapat ditambahkan ke database aplikasi yang dibahas dalam tutorial Blog dan Poll &Survey. Tutorial ini mengasumsikan bahwa izin dikodekan secara keras pada tingkat kode untuk memeriksa akses.

Anda juga dapat mengunjungi tutorial populer termasuk Cara Menginstal MySQL 8 di Ubuntu, Cara Menginstal MySQL 8 di Windows, Basis Data Blog di MySql, Basis Data Poll dan Survei di MySql, dan Mempelajari Kueri SQL Dasar di MySQL.

Basis Data RBAC

Langkah pertama adalah membuat Database RBAC. Itu dapat dibuat menggunakan kueri seperti yang ditunjukkan di bawah ini.

CREATE SCHEMA `rbac` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Saya telah menggunakan set karakter utf8mb4 untuk mendukung berbagai karakter.

Tabel Pengguna

Di bagian ini, kita akan mendesain Tabel Pengguna untuk menyimpan informasi pengguna. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Pengguna.

Id Id unik untuk mengidentifikasi pengguna.
Nama Depan Nama depan pengguna.
Nama Tengah Nama tengah pengguna.
Nama Belakang Nama belakang pengguna.
Seluler Nomor ponsel pengguna. Ini dapat digunakan untuk tujuan login dan registrasi.
Email Email pengguna. Ini dapat digunakan untuk tujuan login dan registrasi.
Hash Kata Sandi Hash kata sandi yang dihasilkan oleh algoritme yang sesuai. Kita harus menghindari penyimpanan sandi biasa.
Terdaftar Di Kolom ini dapat digunakan untuk menghitung umur pengguna dengan aplikasi tersebut.
Login Terakhir Ini dapat digunakan untuk mengidentifikasi login terakhir pengguna.
Pengantar Pengenalan singkat tentang Pengguna.
Profil Detail pengguna.

Tabel Pengguna dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.

CREATE TABLE `rbac`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );

Tabel Peran

Di bagian ini, kita akan mendesain Tabel Peran untuk menyimpan peran sistem. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Peran.

Id Id unik untuk mengidentifikasi peran.
Judul Judul peran.
Siput Siput unik untuk mencari peran.
Deskripsi Deskripsi untuk menyebutkan peran.
Aktif Bendera untuk memeriksa apakah peran sedang aktif.
Dibuat Pada Ini menyimpan tanggal dan waktu saat peran dibuat.
Diperbarui Pada Ini menyimpan tanggal dan waktu saat peran diperbarui.
Konten Detail lengkap tentang peran tersebut.

Tabel Peran dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.

CREATE TABLE `rbac`.`role` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`description` TINYTEXT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC) );

Tabel Izin

Di bagian ini, kami akan mendesain Tabel Izin untuk menyimpan izin sistem. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Izin.

Id Id unik untuk mengidentifikasi izin.
Judul Judul izin.
Siput Siput unik untuk mencari izin.
Deskripsi Deskripsi untuk menyebutkan izin.
Aktif Bendera untuk memeriksa apakah izin sedang aktif.
Dibuat Pada Ini menyimpan tanggal dan waktu saat izin dibuat.
Diperbarui Pada Ini menyimpan tanggal dan waktu saat izin diperbarui.
Konten Detail lengkap tentang izin.

Tabel Izin dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.

CREATE TABLE `rbac`.`permission` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`description` TINYTEXT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC) );

Tabel Izin Peran

Tabel Izin Peran dapat digunakan untuk menyimpan pemetaan izin ke peran. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Izin Peran.

Id Peran Id peran untuk mengidentifikasi peran.
Id Izin Id izin untuk mengidentifikasi izin.
Dibuat Pada Ini menyimpan tanggal dan waktu saat pemetaan dibuat.
Diperbarui Pada Ini menyimpan tanggal dan waktu saat pemetaan diperbarui.

Tabel Izin Peran dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.

CREATE TABLE `rbac`.`role_permission` (
`roleId` BIGINT NOT NULL,
`permissionId` BIGINT NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL,
PRIMARY KEY (`roleId`, `permissionId`),
INDEX `idx_rp_role` (`roleId` ASC),
INDEX `idx_rp_permission` (`permissionId` ASC),
CONSTRAINT `fk_rp_role`
FOREIGN KEY (`roleId`)
REFERENCES `rbac`.`role` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_rp_permission`
FOREIGN KEY (`permissionId`)
REFERENCES `rbac`.`permission` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Peran Pengguna

Kami dapat menjaga sistem tetap sederhana dengan menetapkan satu peran kepada pengguna. Peran yang ditetapkan dapat digunakan untuk menarik izin yang dipetakan ke peran tersebut. Akses ke sumber daya atau izin tertentu dapat diperiksa dengan membandingkan izin hard-coded daftar izin yang dipetakan dengan peran yang diberikan kepada pengguna.

Itu dapat dilakukan dengan menggunakan kueri seperti yang ditunjukkan di bawah ini.

ALTER TABLE `rbac`.`user` 
ADD COLUMN `roleId` BIGINT NOT NULL AFTER `id`,
ADD INDEX `idx_user_role` (`roleId` ASC);

ALTER TABLE `rbac`.`user`
ADD CONSTRAINT `fk_user_role`
FOREIGN KEY (`roleId`)
REFERENCES `rbac`.`role` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Opsi Lanjutan

Seseorang dapat memikirkan untuk menetapkan beberapa peran kepada pengguna menggunakan Tabel Peran Pengguna. Opsi yang lebih canggih menyertakan sistem hierarki untuk mengelompokkan izin atau peran. Opsi ini semakin memperumit kueri untuk menarik daftar izin, oleh karena itu perlu pengoptimalan dengan memiliki mekanisme cache yang sesuai.

Ringkasan

Dalam tutorial ini, kita telah membahas desain database sistem RBAC untuk mengamankan permintaan dan sumber daya tertentu dengan mengizinkan akses hanya jika pengguna memiliki izin yang sesuai.

Anda dapat mengirimkan komentar Anda untuk bergabung dalam diskusi. Anda mungkin juga tertarik untuk mendesain database aplikasi Blog dan Poll &Survey.

Skema database lengkap juga tersedia di GitHub.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mengatur kata sandi root ke nol

  2. Apakah SQL Server Menawarkan Apa Pun Seperti MySQL's ON DUPLICATE KEY UPDATE?

  3. Bagaimana cara melakukan Pemodelan Warisan dalam Basis Data Relasional?

  4. Waktu Mulai MySQL Lambat dalam mode GTID? Ukuran File Log Biner Mungkin Menjadi Masalah

  5. MySQL LOAD DATA INFILE dengan ON DUPLICATE KEY UPDATE