◆孫恒一
?
一種擴展型RBAC電力交易系統權限模型設計與實現
◆孫恒一
(昆明電力交易中心有限責任公司 云南 650011)
基于角色的訪問控制(Role-Based Access Control,RBAC)是廣泛使用的系統權限訪問控制模型。本文設計并實現了一種擴展型RBAC電力交易系統權限模型,采用“資源-權限-角色-用戶-組織”模式的設計,在角色權限的基礎上引入用戶的正向和負向權限,并利用開源安全框架Shiro,在云南電力交易系統實現了基于RBAC和用戶授權的細粒度權限控制,滿足了系統針對多種類別市場參與者靈活的權限控制需求。
擴展型RBAC;電力交易系統權限模型;Shiro
云南電力交易系統作為承載云南省電力市場化交易業務的系統支撐平臺,系統用戶范圍涵蓋發電企業、用電企業、電力交易中心、政府監管機構、電網公司及其下屬供電單位、售電公司等市場參與類型。由于系統中的交易申報和成交結果等數據涉及各市場參與者的敏感信息,同時為了滿足業務劃分的要求,電力交易系統需實現細粒度的權限訪問控制[1]。
基于角色的訪問控制(Role-Based Access Control,RBAC)是廣泛使用的系統權限訪問控制模型。在實際中,角色通常根據某項工作或職責來創建,RBAC極大簡化了系統權限管理[2]。然而在程序代碼中,直接在操作前使用角色名稱來進行訪問控制的方法缺少權限配置的靈活性和擴展性,也增加了代碼變更的頻繁程度以及代碼維護的復雜程度。
由于云南電力交易系統的用戶范圍涵蓋多種類型市場參與者,在電力交易中心內部又按照業務劃分不同的業務部門,因此需要多種類型的系統用戶。通過控制不同類型用戶對不同功能或數據的訪問實現細粒度的權限控制。
云南電力交易系統的權限劃分遵循“最小權限”原則,確保系統針對不同用戶具備相應合理規范的功能操作范圍和數據可視范圍,以保證市場運行的規范性和交易主體數據的安全性。嚴格限制核心明細數據的查詢權限,交易主體只能查詢自身核心明細數據,交易中心與政府監管部門以實際工作需要為原則配置核心明細數據的查詢權限。
按照權限劃分總體原則,表1列舉了云南電力交易系統部分主要功能的權限劃分需求,權限類別分為:具有全局操作和查詢權限、具有自身數據的操作和查詢權限、具有全局查詢權限、具有自身數據查詢權限、不具有權限。操作權限在實現時又可包含新增、修改等不同的操作,在功能上主要體現為申報、申請、審核等功能或流程。
表1 云南電力交易系統部分主要功能的權限劃分需求表
參照云南電力交易系統的權限設計需求,下文采用“資源-權限-角色-用戶-組織”模式,設計一種擴展型RBAC權限模型。
在RBAC模型中,系統權限與角色關聯,用戶被賦予適當的角色而得到相應角色的權限,角色實際上為一組權限的集合,一個角色對應多個用戶,一個用戶可以擁有多個角色。
基于角色的訪問控制為系統用戶權限管理提供了一個有效的抽象層次。在實際系統使用過程中,角色一旦創建并分配給多個用戶之后,角色中的權限組合一般不會增減。為了滿足電力交易系統更加靈活的權限配置需求,適應業務管理的變化,本文對RBAC進行了以下擴展設計。
(1)基于資源的權限定義。資源是指在應用中用戶可以訪問的數據、對象、頁面、查看、編輯操作等任何對象,權限則代表用戶可以訪問某個資源的權利,用戶在授權后才能訪問資源。此處,資源的概念已包含了數據和操作,通過這種定義將權限進行了統一設計。
(2)引入用戶的負向和正向權限。在用戶所獲得角色權限的基礎上,減去負向權限,增加正向權限,最終構成用戶所擁有權限的組合。因此,用戶的負向和正向權限優先級將大于角色權限。在實際應用中,由于業務要求需要對某些用戶進行特殊的權限控制時,即可配置用戶負向和正向權限。
(3)通過增加用戶與組織的關系設置用戶默認角色。一般情況下,一個組織下的用戶具有一些相同的權限,將某些特定的角色與組織相關聯,作為該組織下新增用戶的默認角色。
基于以上擴展,設計了云南電力交易系統的權限模型。其中數據結構的設計如圖1所示。
圖1系統權限模型數據結構設計圖
基于上述擴展RBAC權限模型設計,采用開源的安全框架Shiro進行了實現。
Apache Shiro是Java的一個開源的安全框架,主要包含了身份認證(Authentication)、授權(Authorization)、會話管理(Session Manager)、加密(Cryptography)等功能,基于Shiro框架可以很容易的在應用中實現權限控制模型。Shiro的工作機制如圖2所示,主要包含以下核心部分:
圖2 Shiro核心框架和概念圖
(1)主體(Subject):代表了當前與應用交互的“用戶”,可以是一個具體的人,也可以是一個應用服務、自動程序等,是一個抽象概念。
(2)安全管理器(SecurityManager):即所有與安全有關的操作都會與安全管理器交互;且它管理著所有主體,與主體的所有交互都會委托給安全管理器進行執行。
(3)域(Realm):Shiro從域獲取安全數據(如用戶、角色、權限),以判斷用戶身份和授權,可以把域看成Shiro的安全數據源。
在一個簡單的Shiro應用中,應用代碼通過主體來進行認證和授權,而主體又委托給安全管理器進行執行;Shiro將域的數據注入到安全管理器中,從而可以對合法的用戶及其權限進行判斷。具體授權流程如圖3所示:
圖3 Shiro授權流程圖
(1)首先調用Subject.isPermitted*/hasRole*接口,傳入需要判斷的權限或角色,其會委托給SecurityManager,而SecurityManager接著會委托給Authorizer;
(2)Authorizer是真正的授權者,會將傳入的字符解析為角色/權限實例;
(3)在進行授權之前,其會調用相應的Realm獲取Subject相應的角色/權限用于匹配傳入的角色/權限;
(4)Authorizer會判斷Realm的角色/權限是否和傳入的匹配,如果有多個Realm,會委托給ModularRealmAuthorizer進行循環判斷。
Shiro支持多種形式的Realm定義,可采用配置文件、jdbc或自定義Realm類的形式實現Realm。因此,通過在應用中重新實現Realm類,就可實現本文設計的權限控制模型。
基于Shiro框架對上述的擴展RBAC權限模型進行了實現。在集成Shiro框架的基礎上,主要實現以下內容:
(1)實現如圖1所示的數據庫表結構,存儲用戶、角色、權限以及它們之間的關系。
(2)采用“模塊、功能、操作”三元組的方式統一定義一個權限,權限標識符采用字符串“模塊名稱:功能名稱:操作名稱”,用“:”分割名稱,例如“system:user:update”表示系統用戶的修改權限。同時,采用通配符“*”替換某個位置的名稱來表示一組功能或一組操作;在權限標識符前增加“+/-”表示用戶的正向和負向權限。
(3)實現自定義Realm類,從數據庫表獲取權限標識符并解析為權限的實例。
(4)在程序代碼中使用Shiro的方法實現認證和授權機制。
本文結合云南電力交易業務的需求,設計并實現了一種擴展型RBAC電力交易系統權限模型,并基于Shiro框架進行了實現,既簡化了開發,又滿足了系統針對細粒度權限的靈活控制。
[1]昆明電力交易中心有限責任公司編著.電力市場:云南電力市場建設經驗與探索[S].北京:中國電力出版社, 2017.
[2]GB/T 25062-2010.信息安全技術鑒別與授權基于角色的訪問控制[S].北京:中國標準出版社, 2010.