在系統登錄模塊中,常見這樣的問題場景:系統用戶有不同的用戶身份,不同身份的用戶登錄進系統后只能看到自己對應權限的功能菜單,系統管理員可以方便對用戶進行授權以及取消權限。
實現這樣一個功能模塊通常使用基于角色的權限訪問控制,即RBAC(Role Based Access Control)模型。RBAC模型是實現權限資源管理控制的一個普遍通用的模型。
RBAC簡介
基于角色的訪問控制(RBAC)是實現軟件系統安全策略的一種有效的訪問控制方式。其基本思想是,對系統操作的各種權限不是直接授予具體的用戶,而是在用戶集合與權限集合之間建立一個角色集合。每一種角色對應一組相應的權限。一旦用戶被分配了適當的角色后,該用戶就擁有此角色的所有操作權限。
注:ACL模型,即訪問控制列表,一般是指將用戶與權限直接關聯起來的權限管理方式。

RBAC通過定義角色的權限,并對用戶授予某個角色從而來控制用戶的權限,實現了用戶和權限的邏輯分離(區別于ACL模型),這樣做的好處是,不必在每次創建用戶時都進行分配權限的操作,只要分配用戶相應的角色即可,同樣地,要對用戶取消權限時,只需要取消用戶與角色的關聯。通常來講,角色的權限相對穩定,對角色權限變更比用戶權限變更要少得多,所以,RBAC簡化了用戶的權限管理。

資源是指系統中可訪問的模塊、功能等可分配的權限的集合。
角色是指真實場景中的某一類用戶,比如系統管理員、普通員工、部門經理、財務主管等等,通常不同的角色具有不同的權限。角色可以根據需要自由創建,角色總是對應一組資源。
用戶是指可訪問系統的人,一般每個用戶都有唯一的UID識別,用戶可以被授予不同角色。
例如,有一個“公告管理”功能,使用者的角色有兩種:管理員和普通用戶。管理員和普通用戶被授予不同權限,管理員擁有該功能模塊的所有權限,而普通用戶只有部分權限:

RBAC有4個模型概念,分別是RBAC0、RBAC1、RBAC2、RBAC3。
- RBAC0為基礎模型,即本文前面介紹的內容。主要有3個元素:用戶、角色、權限(資源)。用戶與角色、角色與權限之間都是多對多的關系。
- RBAC1是在RBAC0的基礎上,增加了角色間的繼承關系。這種繼承關系可以是多繼承,也可以是單繼承。適用于角色之間層次分明,可以給角色分組分層的場景。
- RBAC2是在RBAC0的基礎上,增加了角色間的約束關系。比如互斥約束,同一用戶只能分配到一組互斥角色集合中的一個角色;基數約束,一個角色被分配到的用戶數量受限,一個用戶可擁有的角色數量受限,一個角色可以擁有的權限資源受限;先決條件約束,僅當用戶已經擁有某一角色時才能給他分配另一種角色,對于角色來講當某一角色擁有某些權限的時候才能給該角色分配另一些權限。運行互斥約束,一個用戶擁有兩個角色,但在運行中不可同時激活這兩種角色。
- RBAC3是RBAC1和RBAC2的組合運用。
可以看到,重點是RBAC基礎模型,其他幾種主要是對角色這個元素的擴充,以適應特定的業務場景。對于絕大多數場景來說,RBAC基礎模型就可以滿足。
數據庫表
實現一個基于RBAC模型的登錄模塊功能,一般需要5張基本數據庫表,分別是:用戶表、資源表(系統模塊菜單及功能表)、角色表、用戶角色關聯表、角色權限表。
本文講解的示例是基于RBAC基礎模型,同時從功能完備性和易于實現方面考慮,給出了7張表。在以上5張表的基礎上,增加了用戶權限表、功能項常量表。
示例中只給出了各個表的一些主要字段,具體使用可根據需要增減。比如一般常用于審計的create_time、update_time、create_by、update_by等字段。
1、用戶表

用戶表存儲可登錄系統的賬號信息。
- user_code: 用戶登錄賬號,在表中唯一性約束。本例中user_code字段作為UID標識字段。
- password:用戶登錄密碼,安全性考慮,一般存儲密文。
2、菜單資源表

菜單權限表存儲系統所有的功能項,包括各級菜單以及與之相對應的操作權限點。這個表反映了系統的全部功能集合,一般由開發人員或運維人員進行維護。
- menu_code: 菜單項編碼,系統內部使用,在表中唯一性約束,標識一個具體的菜單項。菜單項編碼可以按照一定的規則編碼,比如一級菜單m01、m02,二級菜單m0101、m0102、m0201、……,按照這樣的規則,可以根據編碼識別出菜單級別。
- menu_name: 用于在系統界面上展示的菜單項名稱。
- parent:上級菜單標識。比如m0201的上級為m02。
- url: 菜單項對應的鏈接地址。
- icon:菜單項圖標對應的鏈接地址。
- display_order: 菜單項在系統界面上展示的順序,SQL查詢時,根據該字段order by排序。
- function_code: 存儲某一菜單項對應的全部功能點代碼。比如insert;update;query;delete; 功能點代碼來自于下文第7個表。
3、角色表

角色表存儲用戶創建的角色。
- role_code: 角色代碼,唯一標識一個角色,在表中有唯一性約束。
- role_name: 角色名稱。
4、角色權限表

角色權限表存儲角色與權限(資源)的映射關系,多對多關系。
- role_code:引用自角色表中的role_code字段。
- menu_code:引用自菜單資源表menu_code字段。
- function_code:字段內容與菜單資源表function_code字段內容相似。比如菜單資源表該字段內容為insert;update;query;delete,但某個角色不具有對應菜單功能的刪除操作,則function_code字段內容為 insert;update;query。
5、用戶角色表

用戶角色表存儲用戶與角色的映射關系,多對多關系。
- user_code:引用自用戶表user_code字段。
- role_code:引用自角色表role_code字段。
以上5張表即是RBAC基礎模型所必須的表。
6、用戶權限表

用戶權限表存儲用戶與權限(資源)的映射關系,多對多關系。
增加此表的作用是為了實現一個通用的權限管理功能,既可以通過角色給用戶授權,也可以通過給用戶直接綁定權限授權。即兼容RBAC模型與ACL模型。
在一些系統中,當存在一人多崗,用戶數量較少,但角色數量需要較多,這種情況使用ACL模型更為方便。
- user_code:引用自用戶表user_code字段。
- menu_code:引用自菜單資源表menu_code字段。
- function_code:字段內容與菜單資源表function_code字段內容相似。比如菜單資源表該字段內容為insert;update;query;delete,但某個用戶不具有對應菜單功能的刪除操作,則function_code字段內容為 insert;update;query。
7、功能項常量表

功能項常量表存儲的內容如下:

功能項常量表存儲功能點代碼與名稱的對應信息。主要用于維護上面表中function_code字段功能點對應的功能名稱。
- function_code:具體功能代碼,如“新增”代碼為insert,“刪除”代碼為delete。唯一標識一個功能操作,在表中唯一性約束。
- function_name:功能代碼對應的在系統界面展示的功能名稱。
上面表中function_code是多個功能點代碼用分號(??拼接起來存儲的,具體代碼實現時對字符串分割后可以對應此表得到功能點名稱。
這樣設計是一個小的技巧,以簡化功能菜單表存儲的內容,以及簡化權限與角色、與用戶的映射。
實現要點
在理解清楚這些表之后,以下列出幾個實現要點。
- 將系統菜單功能錄入菜單表。注意menu_code、function_code的編碼規則。
- 將系統中全部的功能點錄入功能項常量表。
- 實現用戶管理,對用戶表的單表操作。
- 實現角色管理,對角色表的單表操作。
- 實現用戶角色設置功能,對用戶角色表操作,根據所選擇的用戶執行先delete后insert數據,在同一數據庫事務中處理。
- 實現角色權限設置功能,對角色權限表操作,根據所選擇的角色執行先delete后insert數據,在同一數據庫事務中處理。
- 實現用戶權限設置功能,對用戶權限表操作,根據所選擇的用戶執行先delete后insert數據,在同一數據庫事務中處理。
- 在查詢用戶權限時,要同時查詢用戶權限以及用戶所具有角色的權限,這兩者的數據可能存在重復,例如:用戶權限表維護了用戶A具有“公告管理”的權限,同時用戶A具有的角色“普通用戶”也具有“公告管理”的權限,此時,在后端接口中去重處理即可。
聲明:本文由網站用戶維維發表,超夢電商平臺僅提供信息存儲服務,版權歸原作者所有。若發現本站文章存在版權問題,如發現文章、圖片等侵權行為,請聯系我們刪除。