江蘇南大先騰業務框架(五)角色與授權體系[附原始碼]
概述
許可權控制模型和方式中介紹了先騰框架許可權控制的方法和控制的粒度。框架只能通過角色為使用者授權,不能將操作許可權直接賦給使用者。這樣做主要是為了簡化許可權模型。這一篇主要講使用者的授權模式。
業務和操作定義
許可權控制模型和方式中介紹框架中的操作許可權是和程式碼Controller類中的方法一一對應的。這個類通常是一個業務。所以框架中的業務和操作模型是這樣定義的:
- 一個業務模組通常對應業務需求,每一個業務模組有一個業務id(optId)作為他的主鍵,它在框架中有以下屬性:
- 基本屬性:名稱、業務類別(一般業務,實施業務:只在實施入口中展示)
- 業務入口url,這個屬性並不是必須的,通常作為選單的入口時需要。
- 一組相關的操作許可權
- 一組業務資料操作範圍定義
- 業務操作是框架控制權限的單元,它對應Controller類中的一個方法,它有一個方法名(optMethod),這方法名和業務id構成這個業務操作的唯一標識。業務操作還有以下屬性:
- 基本屬性:名稱、方法名
- 每一個業務操作和一個http請求對應,它可以有 url + http 方法(C:post, R:get, U:put, D:delete)表示,url中引數部分用“*”作為萬用字元代替。
- 業務資料範圍定義;業務資料範圍是一組引數驅動SQL的外部過濾條件。它的形式為:
[物件或者表.欄位或者屬性] sql的操作符比如:= {使用者. 屬性:(預處理)引數名}
角色許可權
角色的定義
前面的“許可權控制模型和方式”中說了框架是通過使用者是否具備相關操作對應的角色來判斷使用者是否具有相關許可權的。角色在框架中就是一組操作許可權和資料範圍許可權的結合。在操作定義中 操作許可權和資料範圍許可權是對等的,都是作為業務的子屬性(子表),但是在角色定義中,它們不是對等的:
- 角色對應一組業務操作
- 可以為每個業務操作選擇這個業務對應的操作範圍許可權,如果不選不是沒有資料範圍許可權而是資料範圍許可權不受控制,即有所有範圍的許可權。
角色類別
框架有以下角色類別:
- F (Fixed)系統內建的,固有的,這些角色不能刪除,但是可以修改其對應的的操作許可權。
- G (global) 全域性的,這個就是給系統管理員用,分級管理員不能使用這個角色。使用角色是值將角色賦予個人。
- P (public) 公用的,這個是系統管理員和分級管理員都可以使用的角色。
- D (department)部門(機構)特有的角色,這個式分級管理員建立的,並且只有對應的機構可以使用的角色。
- H (HIDE) 隱藏角色,不要顯示的,是部門可以自己支配的操作許可權集合。分級管理員建立的角色只能在對應的部分所有具有的H型別的角色許可權範圍內選擇。 一個業務系統根據自己業務需求選擇對應的策略,如果不需要分級管理,就只需要F和G 兩類角色。
內建角色
內建角色就是F型別的角色,它們有:
- anonymous:匿名角色;使用者在沒有登入的狀態下具有的角色。
- public:公共角色;所有登入使用者具有的角色,這個角色不需要顯示的賦給任何人。
- forbidden:禁用的功能;和public相反,這個角色對應的功能任何人都不能訪問,同樣不需要賦予任何人。
- sysadmin : 系統管理員;一般只賦予它系統維護功能,不能賦予它業務功能。
角色授權
角色授權就是將角色賦予使用者,框架提供了多種授權策略,開發人員可以根據業務的需求選擇不同的策略。總體授權可以分為兩種,顯式授權和隱式授權。一個使用者具有的許可權為它所有途徑獲得的角色之和。
顯式授權
顯示授權非常簡單,就是系統管理員將全域性或者公共角色授予某個具體的人,或者分級管理人員將部門角色或者公共角色授予某個具體的人。這些授權資料直接持久化到資料庫中就可以了,參見框架原始碼中的UserRole物件。
隱式授權
隱式授權就是,不是通過將角色和使用者直接關聯而獲取的許可權,一共有兩種方式獲取。
固定角色
固定角色中的anonymous 會預設的給所有未登入的使用者,public 會給所有的登入使用者。系統會根據使用者的登入狀態賦他們這兩個角色之一。
部門角色
部門角色是框架的一個可選的特性,一個角色賦給一個部門,這個部門中的所有成員都將繼承到這個角色。部門角色也有一個可以配置的選項,就是這個部門角色是否會根據部門的層級自動拓展到下級的部門人員。部門層級的拓展目前是通過使用者角色檢視來做的。對開發人員來說需要知道這個細節。
分級授權
分級授權也是框架的可以可選的特性,開發根據業務的需要可以進行裁剪。
一個分級管理員的管理範圍只能和他所在的預設機構(組織)關聯。就是一個分級管理員只能管理他所在的機構以及下級機構的許可權。 分級管理員可以新建這個機構私有的角色(部門角色),並且可以將這些角色賦予使用者。但是分級管理員不能在全域性的功能許可權列表中建立自己的私有角色,他只能在他的部門具有的功能許可權中新建角色。部門的許可權式通過“隱藏角色”來獲得的。 系統(全域性)管理員可也給機構賦予許可權,給機構賦予的許可權對應為程式碼 **“G-”+[部門程式碼]**的角色。