權限模塊是ERP系統的核心模塊之一,完善的權限控制機制給系統增色不少。總結我接觸過的權限模塊,以享讀者。
1 權限的簡明定義
ERP權限管理用一句簡單的話來說就是:誰 能否 做 那些 事。
文句 | 含義 | 說明 |
誰 | 部門+崗位職責 | 也可以不與部門崗位綁定,省略角色定義。 |
能否 | 能(True) 否(False) | 用0或1,true/false表示能否執行 |
做 | 增加/刪除/修改/查詢/統計/打印/過帳 | 權限對象 |
哪些 | 通用的/本人的/本組別的/本部門的/本公司的/其他的/多帳套的 | 范圍:行政部的辦公文具采購申請,PMC運行物料需求計划產生采購部的物料采購計划。 |
事 | 數據(如客戶、供應商、訂單、報表等) |
關於”能否”文句,支持組合拼接。比如有三個權限對象,分別是增加,刪除,修改。用戶A只有修改權限,用數字1表示有權限,則A用戶的權限字符串可以表示為001,這樣可以滿足動態增加權限對象的需求。
關於部門崗位職責,也就是通常說的角色(Role),因為角色的含義着重在於實際的業務理解,系統很難控制到這樣細節的地方,我們的ERP系統省略了角色表,將權限與用戶直接綁定。
2 權限的分類
1) 系統權限 System Login 是否登入系統,能執行哪些模塊,可以看到哪些操作菜單項。對沒有權限操作的界面應該隱藏或變灰,避免提示”對不起,您沒有權限”。
2) 功能權限 Module/Function 對模塊和功能能否有執行權限,功能是系統執行權限控制的基本單元。對模塊權限的操作,可批量設置模塊下功能的權限,程序最終進行判斷的地方還是以功能權限為依據。
2) 數據權限 Data/Field 對功能涉及到的數據是否有增刪查改的權限,能否編輯和查看相同單據其它用戶的數據,能否查看與編輯特殊字段的數據(字段權限),常常是指金額類字段。比如采購模塊的采購收貨與倉庫模塊的采購收貨,后者應該會隱藏與關聯的采購訂單中的物料價格信息。字段權限可以與用戶或用戶組別綁定。
3 權限設計方法:基於角色的訪問機制(Role-Based Access Control,RBAC)
先設計用戶組別,對用戶組別分配權限,再創建用戶綁定到用戶組別。表與其字段定義:
用戶組別(用戶組別編碼,已取消)
用戶組別模塊(用戶組別編碼,模塊編碼,模塊名稱,新增權限,刪權限除,修改權限,過帳權限,打印權限)
用戶組別模塊功能(用戶組別編碼,模塊編碼,功能編碼,新增權限,刪權限除,修改權限,過帳權限,打印權限)
用戶既可以按照模塊批量增加權限,也可單獨的逐個功能增加權限。涉及字段權限的地方需要單獨設置。
4 優化權限模塊設計
1) 考慮多帳套(多數據庫)情況下,授權的一致性。要求提取業務數據庫中的相似數據到框架數據庫中。
2)系統集成。需要考慮與LDAP/DBMS系統的集成性。與域集成時,可以實現免登錄直接進入系統。當與其它數據庫集成時,根據需要設計各自的用戶提供程序,比如OracleUserProvider,MySQLUserProvider,分別實現連接到Oracle和MySQL數據庫中執行權限判斷。
3) 與硬件設備集成。執行權限判斷時自動識別硬件設備,比如Smart Card智能卡或加密狗。
4) 用戶密碼需要加鹽或是MD5加密,或是DES可逆算法加密。拒絕明文存儲密碼,密碼丟失后可用密碼重置功能重設密碼,考慮強密碼策略,包含字母數字和特殊字符組成的密碼。
5) 登錄限制,限制用戶必須在指定的區域(IP地址范圍,局域網子網,域)才能登錄使用。
6) 對沒有權限的功能,應該隱藏或是變灰,以解決權限難題。比如按鈕沒有變灰或隱藏,點擊按鈕后才進行權限判斷,提示”對不起,您沒有權限”,這類提示很不友好,應該要預先判斷權限。
7) 考慮用戶密碼過期,超過一定時間范圍后用戶必須修改密碼以增加安全性。
8) 管理員分配初始密碼時,考慮密碼生成工具,生成隨機字符串密碼,符合Windows強密碼供管理員使用。
5 業務邏輯中的權限控制
ERP系統中有一些權限控制的地方,比如價格控制,信用控制,流程控制等。這些控制不在通用權限系統中考慮。
舉例說明,ERP系統中的用戶權限。
模塊 | 權限 | 說明 |
系統 | 可進入所有公司 | 否則只能進入指定的公司帳套 |
系統 | 可執行多帳套操作 | A公司的銷售單產生B公司的采購單 |
銷售 | 可使用所有客戶 |
需要使用指定的客戶 |
銷售 | 允許關閉報價單 | 報價單關閉后不能再生成銷售單 |
銷售 | 隱藏銷售價格 | 銷售功能中隱藏價格字段 |
銷售 | 允許銷售單修改單價 | 銷售功能中不允許修改單價 |
銷售 | 銷售功能中執行價格下限控制 | 銷售功能中執行總金額控制,比如客戶A的信用上限20萬,向客戶A賣出貨物價值超過20萬時,單據無法通過記帳或審核。 |
采購 | 可使用所有供應商 | 否則只能用指定的供應商 |
采購 | 收貨單不支持超額收貨 | 收貨單收貨數量為100,是否支持收貨120個數量 |
采購 | 隱藏進倉成本 | 隱藏物料進倉價格(先進先出,平均成本) |
采購 | 隱藏采購價格 | 隱藏物料采購價格 |
這些參數控制分布在ERP系統的各個模塊功能中,無法實現抽象化設計。
6 權限對象 動態權限
以上設計中,硬性規定了七種權限,它們是增加,刪除,修改,查詢,統計,打印,過帳。如果要增加其它的權限則會涉及到比較多的改動。考慮將權限對象本身設計為可動態增加的,比如我需要增加一個數據導出權限(Export),只需要在權限對象表中增加一行記錄,並分配可以執行此權限的用戶或用戶組別,增加代碼判斷即可完成權限系統的開發。動態權限在大型管理系統中很常見,預先設計的固定的權限在實施時無法滿足實際需求時,考慮動態權限設計方法。
用友的系統就是把權限設計為一個代碼,用一個表保存用戶具有的權限的代碼。
7 權限申請與批核生效,權限注銷
為避免權限申請人與IT之間的信息溝通不暢,定義權限申請批核和生效流程。
由需要何種權限的用戶提出申請,填寫權限申請表單,選擇需要登入的模塊和功能,再經由用戶所在的部門負責人審批,權限審批通過后,由IT部門確定,權限申請審批生效。
當用戶不再需要登入系統或某種權限時,IT部門直接將用戶注銷或刪除相應的權限,避免審計問題。
8 鑽石白菜理論
買白菜時,通常為了白菜價格是八毛還是一塊與小販爭論不休,斤斤計較;買鑽石時,卻為了追求好看,高貴,毫不在乎鑽石的價格,只求貴的,好看的鑽石。
設計權限模塊以實用為主,不追求過度設計,不追求更完美的設計。
能滿足現有的客戶需求,對未來客戶增加需要不涉及太多的改動,這樣的權限系統設計就是合理合適的。