sql >> データベース >  >> RDS >> Mysql

MySQLでRBACのデータベースを設計するためのガイド

    このチュートリアルでは、ユーザー、役割、およびアクセス許可を管理するための役割ベースのアクセス制御(RBAC)システムのデータベーススキーマを設計するための完全な手順を提供します。さらに、特定の権限に基づいて特定のリソースへのアクセスを決定するために使用できます。 RBACシステムの使用は、複数のユーザー間でリソースを共有するアプリケーションの不可欠な部分と見なす必要があります。例えば。組織の従業員は、割り当てられた権限に基づいて製品にアクセスまたは管理できます。理想的には、権限はロールを介して割り当てることができます。

    実体関連図または視覚的なデータベース設計を以下に示します。

    図1

    メモ :このチュートリアルで説明されている役割と権限のテーブルは、ブログと投票と調査のチュートリアルで説明されているアプリケーションデータベースに追加できます。このチュートリアルでは、アクセスを確認するために、アクセス許可がコードレベルでハードコーディングされていることを前提としています。

    また、UbuntuにMySQL 8をインストールする方法、WindowsにMySQL 8をインストールする方法、MySqlのブログデータベース、MySqlのポーリングおよび調査データベース、MySQLの基本的なSQLクエリの学習などの人気のあるチュートリアルにアクセスすることもできます。

    RBACデータベース

    最初のステップは、RBACデータベースを作成することです。以下に示すクエリを使用して作成できます。

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

    文字セットutf8mb4を使用しました 幅広いキャラクターをサポートします。

    ユーザーテーブル

    このセクションでは、ユーザーテーブルを設計します ユーザー情報を保存します。以下は、ユーザーテーブルのすべての列の説明です。

    Id ミドルネーム モバイル メール パスワードハッシュ 登録場所 最終ログイン はじめに プロフィール
    ユーザーを識別するための一意のID。
    ユーザーの名。
    ユーザーのミドルネーム。
    ユーザーの名前。
    ユーザーの携帯電話番号。ログインと登録の目的で使用できます。
    ユーザーのメールアドレス。ログインと登録の目的で使用できます。
    適切なアルゴリズムによって生成されたパスワードハッシュ。プレーンなパスワードの保存は避けなければなりません。
    この列は、アプリケーションを使用しているユーザーの寿命を計算するために使用できます。
    ユーザーの最後のログインを識別するために使用できます。
    ユーザーの簡単な紹介。
    ユーザーの詳細。

    適切な制約のあるユーザーテーブルは次のとおりです。

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

    ロールテーブル

    このセクションでは、ロールテーブルを設計します システムの役割を保存します。以下は、役割テーブルのすべての列の説明です。

    Id タイトル スラッグ 説明 アクティブ 作成場所 更新日 コンテンツ
    役割を識別するための一意のID。
    役割のタイトル。
    役割を検索するためのユニークなスラッグ。
    役割について説明します。
    役割が現在アクティブであるかどうかを確認するためのフラグ。
    ロールが作成された日時を保存します。
    ロールが更新された日時を保存します。
    役割に関する完全な詳細。

    適切な制約のある役割テーブルは次のとおりです。

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

    許可テーブル

    このセクションでは、権限テーブルを設計します システム権限を保存します。以下は、権限テーブルのすべての列の説明です。

    Id タイトル スラッグ 説明 アクティブ 作成場所 更新日 コンテンツ
    権限を識別するための一意のID。
    許可のタイトル。
    許可を検索するためのユニークなスラッグ。
    許可について言及する説明。
    権限が現在アクティブかどうかを確認するためのフラグ。
    権限が作成された日時が保存されます。
    権限が更新された日時が保存されます。
    許可に関する完全な詳細。

    適切な制約のある権限テーブルは次のとおりです。

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

    役割許可テーブル

    役割許可テーブル ロールへの権限のマッピングを保存するために使用できます。以下は、役割許可テーブルのすべての列の説明です。

    ロールID アクセス許可ID 作成場所 更新日
    役割を識別するための役割ID。
    権限を識別するための権限ID。
    マッピングが作成された日時を保存します。
    マッピングが更新された日時が保存されます。

    適切な制約のある役割許可テーブルは次のとおりです。

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

    ユーザーの役割

    ユーザーに単一の役割を割り当てることで、システムをシンプルに保つことができます。割り当てられたロールを使用して、ロールにマップされた権限をプルできます。特定のリソースまたは権限へのアクセスは、ハードコードされた権限と、ユーザーに割り当てられた役割にマップされた権限のリストを比較することで確認できます。

    以下に示すクエリを使用して実行できます。

    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;

    詳細オプション

    ユーザーロールテーブルを使用して、ユーザーに複数のロールを割り当てることを考えることができます。より高度なオプションには、権限または役割をグループ化するための階層システムが含まれます。これらのオプションは、権限リストを取得するためのクエリをさらに複雑にするため、適切なキャッシュメカニズムを使用して最適化する必要があります。

    概要

    このチュートリアルでは、ユーザーが適切な権限を持っている場合にのみアクセスを許可することで特定の要求とリソースを保護するためのRBACシステムのデータベース設計について説明しました。

    コメントを送信して、ディスカッションに参加できます。 BlogおよびPoll&Surveyアプリケーションのデータベースの設計にも興味があるかもしれません。

    完全なデータベーススキーマはGitHubでも入手できます。


    1. SQL-最大値の列を持つ行を選択する方法

    2. シェルスクリプトからsqlplusを実行している間のエラー処理の管理

    3. VARCHARとCHARの違いは何ですか?

    4. MySQLを保護する方法:パート2