在實際的系統應用環境中,用戶的分級管理一般也是比較常見的功能,小的業務系統可以不需要,但 是一般涉及到集團、分子公司、或者是事業單位裡面的各個處室或者某某局的人員管理,這些分級管理 就顯得比較必要,否則單靠管理員來處理賬號的事情,是比較麻煩一點的。分級管理就是讓不同層次、 不同機構的人員實現一定的自治管理,如分公司的人員有專門的管理員,各地區的處室或者某某局實現 內部人員的創建、調整、角色分配等工作。本篇隨筆主要介紹在我的權限系統中如何實現人員的分級管 理的,給大家提供相應的思路和樣例參考。
1、用戶分級管理的處理邏輯
我們可以把管理員用戶分為兩級,超級管理員和公司管理員,超級管理員可以管理系統所有用戶和全 局配置,公司管理員只能管理自己所在公司的人員信息及相關數據。這樣我們就比較清晰具體的用戶角 色負責哪些信息,以便進行有效的過濾和控制了。
為了實現用戶的角色控制,我們需要在用戶登陸後,獲取用戶的信息和角色列表信息(一個用戶有多 個角色的),把它們放置到系統的全局變量裡面。
/// <summary> /// 登錄用戶信息 /// </summary> public UserInfo UserInfo { get; set; } /// <summary> /// 用戶具有的角色集合 /// </summary> public List<RoleInfo> RoleList { get; set; }
在用戶登陸成功後,我們就可以把用戶信息和角色列表信息賦值給上面的變量,從而可以在本地實現 更好的控制管理。通過UserIsAdmin的函數管理,可以只允許管理員級別(超級管理員和公司管理)的用 戶進行權限系統的登陸。
try { string ip = NetworkUtil.GetLocalIP(); string macAddr = HardwareInfoHelper.GetMacAddress(); string loginName = this.txtUserName.Text.Trim(); string identity = BLLFactory<User>.Instance.VerifyUser(loginName, this.txtPassword.Text, "Security", ip, macAddr); if (!string.IsNullOrEmpty(identity)) { if (BLLFactory<User>.Instance.UserIsAdmin(loginName)) { UserInfo info = BLLFactory<WHC.Security.BLL.User>.Instance.GetUserByName(loginName); Portal.gc.UserInfo = info; //賦值給全局變量“管理用戶” Portal.gc.RoleList = BLLFactory<WHC.Security.BLL.Role>.Instance.GetRolesByUser(info.ID);//用戶的角色集合 bLogin = true; this.DialogResult = DialogResult.OK; } else { MessageDxUtil.ShowWarning("該用戶沒有管理員權限"); return; } } else { MessageDxUtil.ShowWarning("用戶名或密碼錯誤或被禁止登陸"); return; } } catch (Exception err) { MessageDxUtil.ShowError(err.Message); }
然後需要判斷用戶的角色是否符合要求,創建一個判斷函數即可。
/// <summary> /// 判斷當前用戶具有某個角色 /// </summary> /// <param name="roleName">角色名稱</param> /// <returns></returns> public bool UserInRole(string roleName) { bool result = false; if (RoleList != null) { foreach (RoleInfo info in RoleList) { if (info.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase)) { result = true; break; } } } return result; }
我們知道,不同角色的用戶管理的級別數據不同,很大程度上是他們負責的樹節點層次不同,因此對 於組織結構,我們可以根據用戶不同的角色進行構造。
超級管理員,組織機構從頂級節點開始遞歸顯示。
公司管理員,組織機構從所在公司節點開始遞歸顯示。
具體的邏輯代碼就是如下所示。
/// <summary> /// 根據當前用戶身份,獲取對應的頂級機構管理節點。 /// 如果是超級管理員,返回集團節點;如果是公司管理員,返回其公司節點 /// </summary> /// <returns></returns> public OUInfo GetMyTopGroup() { OUInfo groupInfo = null; if (UserInRole(RoleInfo.SuperAdminName)) { groupInfo = BLLFactory<OU>.Instance.GetTopGroup();//超級管理員取集團節點 } else { groupInfo = BLLFactory<OU>.Instance.FindByID(UserInfo.Company_ID);//公司管理員取公司節點 } return groupInfo; }
例如人員的組織機構分類,就可以通過下面的代碼進行不同的限定
/// <summary> /// 初始化組織機構列表 /// </summary> private void InitDeptTreeview() { this.treeDept.BeginUpdate(); this.treeDept.Nodes.Clear(); OUInfo groupInfo = Portal.gc.GetMyTopGroup(); if (groupInfo != null) { TreeNode topnode = new TreeNode(); topnode.Text = groupInfo.Name; topnode.Name = groupInfo.ID.ToString(); topnode.ImageIndex = Portal.gc.GetImageIndex(groupInfo.Category); topnode.SelectedImageIndex = Portal.gc.GetImageIndex(groupInfo.Category); 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(); }
2、用戶分級管理的界面顯示
用戶分級,前面說到,分為了超級管理員和公司管理員,超級管理員用來管理整個系統的相關用戶以 及全局的設置;公司管理員用來管理分公司的人員信息。
我們使用超級管理員登陸權限管理系統,可以看到權限系統的全部功能,超級管理員的界面效果如下 所示。
公司管理員登陸權限系統後,主界面效果如下所示。其中我們可以看到,對於功能、菜單的定義模塊 ,公司管理員沒有權限進行配置,而且用戶僅僅能夠管理屬於自己公司的人員,如下所示 。
查看本欄目
角色管理也是只能管理所屬公司的角色信息,如下所示。
其他模塊,也是只能根據自己公司范圍進行查找,如操作日志,登陸日志等信息。
伍華聰 http://www.iqidi.com