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 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.