我的主頁: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/繼承模型
RBAC1
在RBAC0
的基礎上進行了拓展,主要變化在於增加了角色之間的繼承關係(類似於Java
類繼承),子角色除了擁有自己的權限外也擁有父角色所具有的所有權限。此外RBAC1
又分爲一般繼承和受限繼承:一般繼承關係允許角色間存在多繼承;受限繼承則要求角色繼承關係是一個嚴格的樹結構。總體來說這兩種思想在設計上差別不大,僅在應用上有略微差別。
RBAC2/限制模型
在部分權限要求較爲嚴格的系統中,會要求具有特定職責的用戶不能具有職責之外的權限(角色)(責任分離),這些限制會體現在系統上層開發語言中而與數據庫設計實現無關。例如:在一個公司中,經費申請部門不能擁有經費審覈部門的權限。此模型中常用以下限制:
- 互斥角色 :同一用戶只能分配到一組互斥角色集合中至多一個角色。
- 基數約束 :一個角色被分配的用戶數量受限、一個用戶可擁有的角色數目受限、同樣一個角色對應的訪問權限數目也應受限……
- 先決條件角色 :想獲得B角色必須已有A角色。
- 運行時互斥 :在同一時刻只有一個角色生效。
RBAC3/綜合模型
RBAC3
是RBAC1
和RBAC2
的綜合,既包含角色間的繼承關係,又對用戶角色進行限制。
實現
以下是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_ADMIN
、SUPER_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在理解上並不算很難,我在學習的過程中時間主要花費在了數據庫的設計和實現方面,在使用上也確實可以很方便的對系統進行權限管理,有很大的通用性