在企業級應用中,單一管理員模式難以應對集團化、多層級組織架構下的賬號運維壓力。本文介紹Winform開發框架權限模塊中「用戶分級管理」的設計與實現,通過「超級管理員」與「公司管理員」雙層角色劃分,配合組織機構樹的動態篩選,實現數據權限的自治隔離與精細管控。
用戶登錄成功後,系統驗證其是否具備管理員資質(UserIsAdmin),通過則將用戶信息(UserInfo)與角色集合(RoleList)寫入全局靜態類 Portal.gc,為後續權限判斷提供基礎上下文。
if (BLLFactory<User>.Instance.UserIsAdmin(loginName)) {
UserInfo info = BLLFactory<User>.Instance.GetUserByName(loginName);
Portal.gc.UserInfo = info; // 全局用戶對象
Portal.gc.RoleList = BLLFactory<Role>.Instance.GetRolesByUser(info.ID); // 角色集合
bLogin = true;
this.DialogResult = DialogResult.OK;
}
封裝 UserInRole 方法實現角色包含性檢查,核心邏輯在 GetMyTopGroup:超管返回集團根節點,公司管返回所屬公司節點,作為後續機構樹加載的根起點。
public OUInfo GetMyTopGroup() {
if (UserInRole(RoleInfo.SuperAdminName)) {
return BLLFactory<OU>.Instance.GetTopGroup(); // 集團根節點
} else {
return BLLFactory<OU>.Instance.FindByID(UserInfo.Company_ID); // 公司節點
}
}
初始化部門樹時,以 GetMyTopGroup() 返回的節點為根遞歸構建,自然實現「超管見全樹,公司管見子樹」的數據隔離。
private void InitDeptTreeview() {
this.treeDept.BeginUpdate();
this.treeDept.Nodes.Clear();
OUInfo groupInfo = Portal.gc.GetMyTopGroup();
if (groupInfo != null) {
TreeNode topnode = new TreeNode { Text = groupInfo.Name, Name = groupInfo.ID.ToString(), ... };
topnode.Tag = string.Format("Company_ID='{0}'", groupInfo.ID); // 附帶查詢條件
this.treeDept.Nodes.Add(topnode);
List<OUNodeInfo> list = BLLFactory<OU>.Instance.GetTreeByID(groupInfo.ID);
AddOUNode(list, topnode);
}
this.treeDept.ExpandAll();
this.treeDept.EndUpdate();
}


公司管理員登錄後,主界面自動隱藏「功能定義」「菜單配置」等全局配置模塊;用戶管理、角色管理、操作日志、登陸日志均自動限定在所屬公司數據範圍內。




此分級機制通過「角色判斷 → 根節點確定 → 樹構建 → 數據篩選」的鏈路,以極低耦合成本實現了多租戶級的數據隔離。擴展性上,若引入「部門管理員」角色,僅需在 GetMyTopGroup 中增加判斷分支即可,體現了框架優秀的可維護性。