RBAC模型的分析與實現

我的主頁:isfantasy.com
原文鏈接:RBAC模型的分析與實現

前言

本文介紹了RBAC的基本概念,並對其常用的幾種延伸模型進行了說明,最後使用MySQL給出了其中一種模型的具體實現。

介紹

RBAC全稱爲基於角色的訪問控制模型(Role-based access control),在該模型中,通過讓權限與角色關聯來實現授權,給用戶分配一系列的角色來讓註冊用戶得到這些角色對應的權限,使系統權限分配更加方便。我們在一般的大型系統開發中,幾乎都要考慮權限控制的相關問題,諸如:系統資源權限、用戶行爲權限等,此類問題的實現通常需要數據庫在設計時做出考慮,經過IT屆各種大佬的長期實踐後,總結出了較爲通用的針對權限控制的RBAC設計模型。RBAC不是某種技術框架,它類似於設計模式,是當下流行的一種數據庫(表)設計的思想,它能通過爲用戶分配角色來實現權限的分配,只要你的數據庫設計滿足這種思想便可說你的數據庫使用的是RBAC模型。

分類

概述

在RBAC模型中,一般有以下組成部分:

  • 用戶(User):定義需要權限鑑別操作的主體
  • 角色(Role):定義一批相關聯權限的集合
  • 權限(Permission):定義需要鑑別權限操作的對象
  • 用戶-角色關聯(User-Role):定義用戶所具有的角色
  • 角色-權限關聯(Role-Permission):定義角色所具有的權限

RBAC0/基本模型

RBAC0是最基本的模型,未做特殊要求和擴展,在該模型中,一個用戶可以同時擁有多個角色,每個角色可以擁有多個權限。

RBAC1/繼承模型

RBAC1RBAC0的基礎上進行了拓展,主要變化在於增加了角色之間的繼承關係(類似於Java類繼承),子角色除了擁有自己的權限外也擁有父角色所具有的所有權限。此外RBAC1又分爲一般繼承和受限繼承:一般繼承關係允許角色間存在多繼承;受限繼承則要求角色繼承關係是一個嚴格的樹結構。總體來說這兩種思想在設計上差別不大,僅在應用上有略微差別。

RBAC2/限制模型

在部分權限要求較爲嚴格的系統中,會要求具有特定職責的用戶不能具有職責之外的權限(角色)(責任分離),這些限制會體現在系統上層開發語言中而與數據庫設計實現無關。例如:在一個公司中,經費申請部門不能擁有經費審覈部門的權限。此模型中常用以下限制:

  • 互斥角色 :同一用戶只能分配到一組互斥角色集合中至多一個角色。
  • 基數約束 :一個角色被分配的用戶數量受限、一個用戶可擁有的角色數目受限、同樣一個角色對應的訪問權限數目也應受限……
  • 先決條件角色 :想獲得B角色必須已有A角色。
  • 運行時互斥 :在同一時刻只有一個角色生效。

RBAC3/綜合模型

RBAC3RBAC1RBAC2的綜合,既包含角色間的繼承關係,又對用戶角色進行限制。

實現

以下是RBAC1模型的MySQL數據庫的實現,系統ER圖如下:

用戶表

該表主要包含了基本的用戶信息。

DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin`  (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `username` varchar(255) NOT NULL UNIQUE,
  `password` varchar(255) NOT NULL,
  `last_login_time` datetime NULL COMMENT '最後登陸時間',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間'
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COMMENT='管理員表';

角色表

該表儲存角色信息,其中pid是父級角色的ID值(用於實現角色繼承)、code是角色代碼(BASE_ADMINSUPER_ADMIN)、icon是前端圖標,可有可無、sort用於出現多種同級角色時排序。

DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `pid` int(11) NOT NULL COMMENT '父級角色id',
  `code` varchar(255) NOT NULL COMMENT '角色代碼',
  `icon` varchar(255) COMMENT '圖標',
  `description` varchar(255) NOT NULL COMMENT '描述',
  `status` int(1) NULL DEFAULT 1 COMMENT '啓用狀態:0->禁用;1->啓用',
  `sort` int(11) NULL DEFAULT 0 COMMENT '權重'
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COMMENT='角色表';

權限表

該表主要包含具體權限信息,其中name是權限名稱(介紹)、value是權限值(識別標誌)、type是權限類型(目錄權限、菜單權限、按鈕權限)、uri是前端資源路徑(通常用於web系統中)。

DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission`  (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(255) NOT NULL COMMENT '名稱',
  `value` varchar(255) NOT NULL COMMENT '權限值',
  `icon` varchar(255) COMMENT '圖標',
  `type` int(1) DEFAULT 2 COMMENT '權限類型:0->目錄;1->菜單;2->按鈕(接口綁定權限)',
  `uri` varchar(1024) COMMENT '前端資源路徑',
  `sort` int(11) NULL DEFAULT 0 COMMENT '權重',
  `status` int(1) NULL DEFAULT 1 COMMENT '啓用狀態:0->禁用;1->啓用'
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COMMENT='權限表';

用戶-角色關聯表

該表主要記錄某一用戶具有哪些角色。

DROP TABLE IF EXISTS `admin_role`;
CREATE TABLE `admin_role`  (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `admin_id` int(11) NOT NULL,
  `role_id` int(11) NOT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間'
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COMMENT='用戶-角色關聯表';

角色-權限關聯表

該表主要記錄某一角色具有哪些權限。

DROP TABLE IF EXISTS `role_permission`;
CREATE TABLE `role_permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `role_id` int(11) NOT NULL,
  `permission_id` int(11) NOT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間'
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COMMENT='角色-權限關聯表';

總結

總體來說RBAC在理解上並不算很難,我在學習的過程中時間主要花費在了數據庫的設計和實現方面,在使用上也確實可以很方便的對系統進行權限管理,有很大的通用性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章