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,今日頭條以及新浪微博,以官網itzixi.com為主


推薦閱讀:

TAG:許可權管理 | 許可權驗證 | 用戶許可權 |