Shiro系列(2) - 許可權模型以及許可權分配的兩種方式
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(訪問報表數據)) { // 訪問用戶數據 和 報表數據}
那麼這樣的話我們只有針對當前登錄的用戶,增加相應的資源許可權即可,沒有必要再去維護代碼,減少了程序的代碼維護。因為資源在整個系統中是靜態對象。
*增減資源許可權需要另開一個許可權資源分配的模塊,在這個模塊中設置用戶的資源許可權即可,一般由頂級賬戶來操作。
<未完待續...>
具體內容同步更新文章以及視頻到微信公眾號,知乎,豆瓣,cnblogs,今日頭條以及新浪微博,以官網http://itzixi.com為主
推薦閱讀: