首先,白話一下RBAC模型。RBAC是基于角色的通路控制(Role-Based Access Control)的簡稱。RBAC認為權限授權實際上是Who、What、How的問題。在RBAC模型中,who、what、how構成了通路權限三元組,也就是“Who對What進行How操作”。至于RBAC模型具體包含哪些内容,網上有很多相關的資料,可以參考一下。下面,主要寫寫自己對RBAC的了解和在Xianfeng平台中的應用。
了解RBAC,還是從““Who對What進行How操作”出發,Who實際上就是功能操作的主體,可以了解為系統使用者,而What實際上就是功能操作的客體,範圍比較廣泛,可以是系統菜單,也可以是功能頁面或者系統中的檔案等等,稱之為使用者可操作的系統資源,而How實際上就是對具體功能操作的一種抽象表示,比如把增加使用者的功能操作抽象表示為“新增使用者”。通過這樣簡單的了解,很容易把RBAC模型和我們實際開發的系統聯系起來。
實作權限控制的步驟大體分為以下幾步:
(1)建立系統使用者和系統資源之間的權限映射關系;
(2)對使用者通路的關鍵資源進行權限過濾;
(3)回報使用者權限過濾的結果
1、建立系統使用者和系統資源之間的權限映射關系
涉及到的實體如下:
子產品(Module):實作系統功能的子產品化劃分,比如子系統等;
功能(Function):一個完整的業務過程,比如使用者管理等;
操作(Operation):業務過程所包含的關鍵業務點,比如使用者管理的新增、修改、删除等,
資源(Resource):功能操作的客體,比如系統菜單,檔案等;
使用者(User):功能操作的主體,既登入系統的使用者;
角色(Role):可以認為是操作集合的另外一種表示方法,通過給使用者配置設定角色來确定使用者有權限的操作範圍。
實體關系模型如下圖所示:

使用者(User)和操作(Operation)、操作(Operation)和資源(Resource)之間的關系為弱化關系,既可有可無的關系,簡單實作方法可以忽略這種弱化關系的存在。
簡單來看,給使用者和資源之間建立權限映射關系,實際上就是确定使用者有哪些角色。
2、對使用者通路的關鍵資源進行權限過濾
以一個具體的業務場景為例,有一個管理功能頁面,頁面上包含“新增”、“修改”、“删除”3個按鈕,假設此頁面隻有管理者可通路,并且隻有超級管理者才有按鈕操作權限。
從假設的業務場景得知,管理功能具有4個操作,包含查詢、新增、修改和删除,管理者具有查詢權限,而超級管理者還具有新增、修改和删除的權限。
功能頁面,屬于系統資源,可以使用頁面的URL作為權限過濾的辨別符,因為在一個系統中,URL總是唯一的,另外,頁面上的操作按鈕,也屬于系統資源,為了實作權限過濾,必須綁定一個唯一的權限過濾辨別符,可以通過擴充HTML屬性的方式來綁定唯一的權限過濾辨別符,示例如下:
其中,safeURI屬性的值“system.user@insert"就表示系統增加使用者操作的唯一權限過濾辨別符。
無論是管理者,還是超級管理者,隻要對系統中的關鍵資源進行通路,根據其角色關聯的操作集合,周遊出是否包含目前資源的權限過濾辨別符,就可以判斷有無權限進行目前操作,進而實作權限控制。
3、回報權限過濾的結果
對系統關鍵資源進行權限過濾之後,如果目前登入使用者具有操作權限,就繼續使用者操作;反之,如果目前登入使用者沒有操作權限,需要傳回無操作權限的結果給使用者。