Hướng dẫn này cung cấp các bước hoàn chỉnh để thiết kế lược đồ cơ sở dữ liệu của hệ thống Kiểm soát truy cập dựa trên vai trò (RBAC) để quản lý người dùng, vai trò và quyền. Nó có thể được sử dụng thêm để quyết định quyền truy cập vào các tài nguyên cụ thể dựa trên các quyền cụ thể. Sử dụng hệ thống RBAC nên được coi là một phần không thể thiếu của bất kỳ ứng dụng nào chia sẻ tài nguyên giữa nhiều người dùng. Ví dụ. nhân viên của một tổ chức có thể truy cập hoặc quản lý các sản phẩm dựa trên các quyền được giao cho họ. Lý tưởng nhất là các quyền có thể được chỉ định thông qua các vai trò.
Sơ đồ mối quan hệ thực thể hoặc thiết kế cơ sở dữ liệu trực quan được hiển thị bên dưới.
Hình 1
Ghi chú :Các bảng vai trò và quyền được thảo luận trong hướng dẫn này có thể được thêm vào cơ sở dữ liệu ứng dụng được thảo luận trong hướng dẫn Blog và Thăm dò ý kiến &Khảo sát. Hướng dẫn này giả định rằng các quyền được mã hóa cứng ở cấp mã để kiểm tra quyền truy cập.
Bạn cũng có thể xem các hướng dẫn phổ biến bao gồm Cách cài đặt MySQL 8 trên Ubuntu, Cách cài đặt MySQL 8 trên Windows, Cơ sở dữ liệu blog trong MySql, Cơ sở dữ liệu thăm dò và khảo sát trong MySql và Tìm hiểu các truy vấn SQL cơ bản trong MySQL.
Cơ sở dữ liệu RBAC
Bước đầu tiên là tạo Cơ sở dữ liệu RBAC. Nó có thể được tạo bằng cách sử dụng truy vấn như hình dưới đây.
CREATE SCHEMA `rbac` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Tôi đã sử dụng bộ ký tự utf8mb4 để hỗ trợ nhiều loại ký tự.
Bảng Người dùng
Trong phần này, chúng tôi sẽ thiết kế Bảng người dùng để lưu trữ thông tin người dùng. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Người dùng.
Id | Id duy nhất để xác định người dùng. |
Tên | Tên của người dùng. |
Tên đệm | Tên đệm của người dùng. |
Họ | Họ của người dùng. |
Di động | Số điện thoại di động của người dùng. Nó có thể được sử dụng cho mục đích đăng nhập và đăng ký. |
Email của người dùng. Nó có thể được sử dụng cho mục đích đăng nhập và đăng ký. | |
Băm mật khẩu | Mật khẩu băm được tạo bởi thuật toán thích hợp. Chúng tôi phải tránh lưu trữ mật khẩu đơn giản. |
Đã đăng ký tại | Cột này có thể được sử dụng để tính toán tuổi thọ của người dùng với ứng dụng. |
Lần Đăng nhập Cuối cùng | Nó có thể được sử dụng để xác định thông tin đăng nhập cuối cùng của người dùng. |
Giới thiệu | Phần giới thiệu ngắn gọn về Người dùng. |
Hồ sơ | Chi tiết người dùng. |
Bảng Người dùng với các ràng buộc thích hợp được hiển thị bên dưới.
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) );
Bảng vai trò
Trong phần này, chúng tôi sẽ thiết kế Bảng vai trò để lưu trữ các vai trò hệ thống. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng vai trò.
Id | Id duy nhất để xác định vai trò. |
Tiêu đề | Chức danh. |
Slug | Sên duy nhất để tìm kiếm vai trò. |
Mô tả | Mô tả đề cập đến vai trò. |
Đang hoạt động | Cờ để kiểm tra xem vai trò hiện đang hoạt động hay không. |
Được tạo lúc | Nó lưu trữ ngày và giờ mà vai trò được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ mà vai trò được cập nhật. |
Nội dung | Chi tiết đầy đủ về vai trò. |
Bảng Vai trò với các ràng buộc thích hợp được hiển thị bên dưới.
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) );
Bảng Quyền
Trong phần này, chúng tôi sẽ thiết kế Bảng quyền để lưu trữ các quyền của hệ thống. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Quyền.
Id | Id duy nhất để xác định quyền. |
Tiêu đề | Tiêu đề quyền. |
Slug | Con sên duy nhất để tìm kiếm quyền. |
Mô tả | Mô tả đề cập đến quyền. |
Đang hoạt động | Cờ để kiểm tra xem quyền hiện đang hoạt động hay không. |
Được tạo lúc | Nó lưu trữ ngày và giờ tại đó quyền được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ tại đó quyền được cập nhật. |
Nội dung | Chi tiết đầy đủ về quyền. |
Bảng Quyền với các ràng buộc thích hợp được hiển thị bên dưới.
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) );
Bảng cho phép vai trò
Bảng quyền của vai trò có thể được sử dụng để lưu trữ ánh xạ của các quyền đối với các vai trò. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Quyền của Vai trò.
Id vai trò | Id vai trò để xác định vai trò. |
Id Quyền | Id quyền để xác định quyền. |
Được tạo lúc | Nó lưu trữ ngày và giờ mà ánh xạ được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ mà bản đồ được cập nhật. |
Bảng Quyền của Vai trò với các ràng buộc thích hợp được hiển thị bên dưới.
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);
Vai trò của Người dùng
Chúng ta có thể giữ cho hệ thống đơn giản bằng cách chỉ định một vai trò duy nhất cho người dùng. Vai trò được chỉ định có thể được sử dụng để kéo các quyền được ánh xạ tới vai trò. Quyền truy cập vào tài nguyên hoặc quyền cụ thể có thể được kiểm tra bằng cách so sánh quyền được mã hóa cứng với danh sách các quyền được ánh xạ tới vai trò được chỉ định cho người dùng.
Nó có thể được thực hiện bằng cách sử dụng truy vấn như hình dưới đây.
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;
Tùy chọn nâng cao
Người ta có thể nghĩ đến việc gán nhiều vai trò cho người dùng bằng Bảng vai trò người dùng. Các tùy chọn nâng cao hơn bao gồm hệ thống phân cấp để nhóm các quyền hoặc vai trò. Các tùy chọn này làm phức tạp thêm truy vấn để kéo danh sách quyền, do đó cần tối ưu hóa bằng cách có một cơ chế bộ nhớ cache thích hợp.
Tóm tắt
Trong hướng dẫn này, chúng tôi đã thảo luận về thiết kế cơ sở dữ liệu của hệ thống RBAC để bảo mật các yêu cầu và tài nguyên cụ thể bằng cách chỉ cho phép truy cập nếu người dùng có quyền thích hợp.
Bạn có thể gửi bình luận của mình để tham gia thảo luận. Bạn cũng có thể quan tâm đến việc thiết kế cơ sở dữ liệu của các ứng dụng Blog và Poll &Survey.
Lược đồ cơ sở dữ liệu hoàn chỉnh cũng có sẵn trên GitHub.