一寫完後,好久沒有繼續寫了。最近公司又在重新開發許可權系統了,但是由於我人微言輕,無法阻止他們設計一個太監版的許可權系統。想想確實是官大一級壓死人啊, 沒辦法我只好不參與了 讓他們去折騰。 我就大概說一下公司目前在做的許可權系統,各位看官給點評價。 設計總體要求: (註:項目名稱為 統一許可權管理系統) 1 ...
一寫完後,好久沒有繼續寫了。最近公司又在重新開發許可權系統了,但是由於我人微言輕,無法阻止他們設計一個太監版的許可權系統。想想確實是官大一級壓死人啊, 沒辦法我只好不參與了 讓他們去折騰。
我就大概說一下公司目前在做的許可權系統,各位看官給點評價。
設計總體要求: (註:項目名稱為 統一許可權管理系統)
1.做一個通用許可權系統。
2.許可權設計按照角色設置。
3.提供統一許可權介面
以上就是整體要求,解釋一下, 我們的通用是指的以後每開發一套新系統,只需要在統一許可權管理系統中進行相應的配置就好了,無需再去開發一套許可權系統。說白了就是所有系統各自有自己的許可權資料庫表,表名稱和欄位都一樣,只是在不同的資料庫中,但是公用一套統一的設置頁面,進入統一許可權系統後,先選擇具體的系統 比如財務系統,然後就進入財務系統的許可權管理(原理很簡單 就是在選擇具體系統的時候切換到相應的資料庫)。
相信在之前的一篇文章中我已經詳細介紹過我的設計思路 即:所有許可權跟用戶掛鉤, 最終的許可權體現在用戶許可權表中。而用戶角色在我的設計中只是起到了一個統一分配許可權的作用, 即使沒有角色也沒關係,我可以直接給某個用戶分配許可權。這樣設計我認為分配許可權是非常靈活的,但是有個缺點就是用戶許可權表的數據量有點大,我們目前的erp系統中該表已經有了250萬條數據了,3800多個用戶平均有600多條數據。但是並不影響快速檢索,而目前他們做的角色設計是所有人的許可權都來自於角色,於是當某個用戶有特殊許可權的時候不得不給他新建一個角色(我也是無語了,就這種設計居然也能被通過,嚴重不滿足複雜許可權需求的情況,後期導致過多的角色,混亂是可以想象的)。
另外還有一個非常坑爹的設計 即每當在統一許可權系統創建一個新的系統時,比如財務系統,那就在一臺資料庫伺服器上添加一個相應的資料庫(只有許可權相關的表)。兩個系統就兩個資料庫只是名稱不同。(註意一點:是同一臺資料庫伺服器上)。這樣腦殘的設計最終的結果就是 財務系統的業務表和許可權表分別放在不同的伺服器上了, 那麼需要得到用戶許可權時就得去調用webapi介面獲取。可以想象系統間將嚴重耦合 , 所有系統依賴於許可權介面,而且所有許可權表放在同一臺資料庫伺服器上安全風險很高,一旦介面或者資料庫出問題那麼所有系統都掛掉,另外一個問題是不得不在許可權表和業務表之間同步數據許可權(如:分銷商許可權,分銷商是屬於業務相關的數據,也是數據許可權的一種,那麼在業務中新添加一個分銷商就得通過介面同步到許可權表中,耦合性也很高)。
好了吐槽結束,那麼我會怎麼改進這個設計呢? 通過以上的分析可以看出存在的幾個問題:
1.完全按照角色分配許可權不夠靈活。
2.所有許可權表放在同一臺伺服器上耦合性太高,不安全,且無法做表之間的關聯。
3.設計太複雜,導致系統效率降低(主要是指 需要介面獲取許可權不夠快(緩存是個辦法,但是不得不考慮緩存過期))。
針對以上問題我的設計是:1.用戶的所有最終許可權都可以跟用戶id直接掛鉤(即:用戶的許可權不完全依賴於角色,最終用戶所有的許可權體現是在用戶許可權表中)。
2.每套系統的許可權表跟業務表放在同一個資料庫中,只是將管理許可權的頁面統一。
3.統一許可權管理系統的資料庫中只保留 用戶表,系統信息表,用戶系統表等基本的表(註:公司所有的用戶放在一起,方便統一登錄系統,即財務系統和進銷存系統只用登錄一個,另一個直接切換不需要重覆登錄每個系統)。
梳理一下統一許可權管理的流程如下:
1.用戶通過同一個登錄網址進入系統。
2. 判斷用戶是否為管理員,如果是管理員則跳轉到系統管理頁面,如果是普通用戶就跳轉到選擇業務系統的入口。
3.管理員可以添加系統,輸入系統名稱,編碼,以及資料庫的賬號密碼 點擊創建系統(這裡需要資料庫的賬號密碼,後臺會做加密處理,安全性應該沒問題),也可以點擊進入之前已經創建的系統。
4.管理相應的用戶許可權。
總結統一許可權分配提供如下功能:
1.業務系統維護(即:可以管理業務系統,比如添加一個財務系統,那麼根據添加時提供的資料庫賬號密碼 會自動創建一套許可權相關的表)
2.用戶管理(公司所有的用戶都統一在這裡管理,方便做統一登錄等)
3.系統頁面管理(即:業務系統的頁面管理,比如:財務的賬套管理頁面,那麼我需要配置 頁面名稱,頁面地址,頁面圖標,是否啟用,是否顯示等)
4.系統數據字典(即 表欄位)
5.功能按鈕 (添加,修改 等等)
6.頁面許可權分配(將頁面和字典、功能關聯在一起。即:頁面有哪些欄位,哪些功能按鈕)
7.用戶許可權分配 (勾選用戶的許可權 包括:頁面許可權,欄位許可權,功能按鈕許可權,數據許可權)
8.角色管理
9.部門管理
10.角色許可權管理(給角色分配許可權 一樣是 頁面許可權 欄位許可權 功能許可權 數據許可權 不同的是角色許可權的變化需要反映到對應的用戶上)
11.統一登錄功能(公司所有的軟體系統都統一在這裡登錄,登錄後再選擇業務系統,業務系統之間跳轉不需要重新登錄。)
12.資料庫相關的操作(資料庫表添加,簡單查詢,添加數據,備份等)
13.日誌(登錄日誌,操作日誌,錯誤日誌)
設計大概就是這些了,我打算利用休息時間,在github上創建一個開源項目來實現這些功能。開發的技術大概是:Asp.net MVC+easyui+Ibatis.net 。具體的github地址過段時間再公佈出來。