Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przewodnik po projektowaniu bazy danych dla RBAC w MySQL

Ten samouczek zawiera kompletne kroki projektowania schematu bazy danych systemu kontroli dostępu opartej na rolach (RBAC) w celu zarządzania użytkownikami, rolami i uprawnieniami. Może być dalej używany do decydowania o dostępie do określonych zasobów na podstawie określonych uprawnień. Korzystanie z systemu RBAC należy traktować jako integralną część każdej aplikacji udostępniającej zasoby wielu użytkownikom. Np. pracownicy organizacji mogą uzyskiwać dostęp do produktów lub zarządzać nimi na podstawie przypisanych im uprawnień. Najlepiej byłoby, gdyby uprawnienia można było przypisać za pomocą ról.

Diagram relacji encji lub wizualny projekt bazy danych pokazano poniżej.

Rys. 1

Notatki :Tabele ról i uprawnień omówione w tym samouczku można dodać do baz danych aplikacji omówionych w samouczkach Blog oraz Ankieta i ankieta. Ten samouczek zakłada, że ​​uprawnienia są zakodowane na stałe na poziomie kodu, aby sprawdzić dostęp.

Możesz także odwiedzić popularne samouczki, w tym Jak zainstalować MySQL 8 w Ubuntu, Jak zainstalować MySQL 8 w Windows, Blog Database w MySql, Baza danych ankiet i ankiet w MySql oraz Nauka podstawowych zapytań SQL w MySQL.

Baza danych RBAC

Pierwszym krokiem jest utworzenie bazy danych RBAC. Można go utworzyć za pomocą zapytania, jak pokazano poniżej.

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

Użyłem zestawu znaków utf8mb4 do obsługi szerokiej gamy znaków.

Tabela użytkowników

W tej sekcji zaprojektujemy Tabelę użytkowników do przechowywania informacji o użytkowniku. Poniżej znajduje się opis wszystkich kolumn tabeli użytkowników.

Identyfikator Unikalny identyfikator do identyfikacji użytkownika.
Imię Imię użytkownika.
Drugie imię Drugie imię użytkownika.
Nazwisko Nazwisko użytkownika.
Komórka Numer telefonu komórkowego użytkownika. Może być używany do celów logowania i rejestracji.
Poczta e-mail E-mail użytkownika. Może być używany do celów logowania i rejestracji.
Hash hasła Skrót hasła wygenerowany przez odpowiedni algorytm. Musimy unikać przechowywania zwykłych haseł.
Zarejestrowano w Ta kolumna może być użyta do obliczenia życia użytkownika z aplikacją.
Ostatnie logowanie Może być używany do identyfikacji ostatniego logowania użytkownika.
Wprowadzenie Krótkie wprowadzenie Użytkownika.
Profil Szczegóły użytkownika.

Tabela użytkownika z odpowiednimi ograniczeniami jest pokazana poniżej.

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) );

Tabela ról

W tej sekcji zaprojektujemy Tabelę ról do przechowywania ról systemowych. Poniżej znajduje się opis wszystkich kolumn tabeli ról.

Identyfikator Unikalny identyfikator do identyfikacji roli.
Tytuł Tytuł roli.
Ślimak Unikalny ślimak do wyszukiwania roli.
Opis Opis wymieniający rolę.
Aktywny Flaga sprawdzająca, czy rola jest aktualnie aktywna.
Utworzono w Przechowuje datę i godzinę utworzenia roli.
Aktualizacja o Przechowuje datę i godzinę aktualizacji roli.
Treść Pełne szczegóły dotyczące roli.

Tabela ról z odpowiednimi ograniczeniami jest pokazana poniżej.

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) );

Tabela uprawnień

W tej sekcji zaprojektujemy Tabelę uprawnień do przechowywania uprawnień systemowych. Poniżej znajduje się opis wszystkich kolumn tabeli uprawnień.

Identyfikator Unikalny identyfikator identyfikujący uprawnienia.
Tytuł Tytuł pozwolenia.
Ślimak Unikalny ślimak do wyszukiwania uprawnień.
Opis Opis, w którym należy wspomnieć o pozwoleniu.
Aktywny Flaga sprawdzająca, czy uprawnienie jest aktualnie aktywne.
Utworzono w Przechowuje datę i godzinę utworzenia pozwolenia.
Aktualizacja o Przechowuje datę i godzinę aktualizacji uprawnień.
Treść Pełne szczegóły dotyczące pozwolenia.

Tabela uprawnień z odpowiednimi ograniczeniami jest pokazana poniżej.

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) );

Tabela uprawnień do ról

Tabela uprawnień do ról może służyć do przechowywania mapowań uprawnień do ról. Poniżej znajduje się opis wszystkich kolumn tabeli uprawnień do ról.

Identyfikator roli Identyfikator roli do identyfikacji roli.
Identyfikator uprawnień Identyfikator pozwolenia identyfikujący pozwolenie.
Utworzono w Przechowuje datę i godzinę utworzenia mapowania.
Aktualizacja o Przechowuje datę i godzinę aktualizacji mapowania.

Tabela uprawnień do ról z odpowiednimi ograniczeniami jest pokazana poniżej.

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);

Rola użytkownika

Możemy zachować prostotę systemu, przypisując użytkownikowi pojedynczą rolę. Przypisana rola może służyć do ściągania uprawnień przypisanych do roli. Dostęp do określonego zasobu lub uprawnienia można sprawdzić, porównując uprawnienia zapisane na stałe z listą uprawnień przypisanych do roli przypisanej użytkownikowi.

Można to zrobić za pomocą zapytania, jak pokazano poniżej.

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;

Opcje zaawansowane

Można pomyśleć o przypisaniu wielu ról użytkownikowi za pomocą tabeli ról użytkowników. Bardziej zaawansowane opcje obejmują system hierarchii do grupowania uprawnień lub ról. Opcje te dodatkowo komplikują zapytanie w celu pobrania listy uprawnień, dlatego wymagają optymalizacji poprzez posiadanie odpowiedniego mechanizmu pamięci podręcznej.

Podsumowanie

W tym samouczku omówiliśmy projekt bazy danych systemu RBAC w celu zabezpieczenia określonych żądań i zasobów poprzez zezwolenie na dostęp tylko wtedy, gdy użytkownik ma odpowiednie uprawnienia.

Możesz przesłać swoje uwagi, aby dołączyć do dyskusji. Możesz być również zainteresowany zaprojektowaniem bazy danych aplikacji Blog oraz Ankieta i ankieta.

Pełny schemat bazy danych jest również dostępny na 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. SQLSTATE[42000]:Błąd składni lub naruszenie dostępu:1064 Wystąpił błąd w składni SQL — PHP — PDO

  2. Jak grupować według tygodnia w MySQL?

  3. Funkcja MySQL do znalezienia liczby dni roboczych między dwiema datami

  4. Użycie if(isset($_POST['submit'])) do niewyświetlania echa, gdy skrypt jest otwarty, nie działa

  5. Jak działa funkcja UPPER() w MySQL