1. 頂級賬戶分配權限
用戶需要被分配相應的權限才可訪問相應的資源。權限是對於資源的操作一張許可證。給用戶分配資源權限需要將權限的相關信息保存到數據庫。
這些相關內容包含:用戶信息、權限管理、用戶分配的權限信息(數據模型)
2. 權限模型設計
主體(user、password)
權限(權限名稱、資源id)/資源(資源名稱、訪問url)
角色(角色名稱)
角色和權限關系(角色id、權限id)
主體和角色關系(主體id、角色id)
3. 權限分配有兩種
3.1 基於角色的權限控制
這些角色包含比如:總經理,技術總監,運營總監
不同的角色可以訪問到的數據權限不同
例:
if (user.ifHasRole('總經理')) {
// 訪問所有資源
}
if (user.ifHasRole('技術總監')) {
// 訪問數據監控
// 訪問服務器信息
}
if (user.ifHasRole('運營總監')) {
// 訪問用戶數據
// 訪問報表數據
}
缺點:在經常變更角色權限的管理系統中無法做到動態管理,因為用戶主體在整個系統中都是活動對象。
舉個栗子:
技術總監需要查看用戶數據,而用戶數據只有運營總監才有權限看,那么此時需要修改代碼了:
if (user.ifHasRole('技術總監') || user.ifHasRole('運營總監')) {
// 訪問數據監控
// 訪問服務器信息
}
所以說這樣的方式不利於系統的擴展,即可擴展性太弱。
當然如果系統可以讓人身兼多只,那么多選角色即可,這個用戶同時有技術總監以及運營總監的身份。
但是如果涉及到HR總監甚至實施總監的功能,那么這個用戶就同時有4個角色,這樣真的好嗎?
3.2 基於資源的權限控制
資源即功能,也就是當前系統所包含的所有功能模塊,這些是不變的
比如button,link,menu等
此時訪問這些資源需要permission來鑒權
例:
if (user.ifHasPermission('訪問用戶數據')) {
// 訪問用戶數據
}
if (user.ifHasPermission('訪問報表數據')) {
// 訪問報表數據
}
if (user.ifHasPermission('訪問用戶數據') || user.ifHasPermission('訪問報表數據')) {
// 訪問用戶數據 和 報表數據
}
那么這樣的話我們只有針對當前登錄的用戶,增加相應的資源權限即可,沒有必要再去維護代碼,減少了程序的代碼維護。因為資源在整個系統中是靜態對象。
*增減資源權限需要另開一個權限資源分配的模塊,在這個模塊中設置用戶的資源權限即可,一般由頂級賬戶來操作。