Shiro權限模型以及權限分配的兩種方式


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('訪問報表數據')) {

    // 訪問用戶數據 和 報表數據

}

 

那么這樣的話我們只有針對當前登錄的用戶,增加相應的資源權限即可,沒有必要再去維護代碼,減少了程序的代碼維護。因為資源在整個系統中是靜態對象。

*增減資源權限需要另開一個權限資源分配的模塊,在這個模塊中設置用戶的資源權限即可,一般由頂級賬戶來操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM