程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Winform開發框架之權限管理系統改進的經驗總結(5) 用戶分級管理

Winform開發框架之權限管理系統改進的經驗總結(5) 用戶分級管理

編輯:關於.NET

在實際的系統應用環境中,用戶的分級管理一般也是比較常見的功能,小的業務系統可以不需要,但 是一般涉及到集團、分子公司、或者是事業單位裡面的各個處室或者某某局的人員管理,這些分級管理 就顯得比較必要,否則單靠管理員來處理賬號的事情,是比較麻煩一點的。分級管理就是讓不同層次、 不同機構的人員實現一定的自治管理,如分公司的人員有專門的管理員,各地區的處室或者某某局實現 內部人員的創建、調整、角色分配等工作。本篇隨筆主要介紹在我的權限系統中如何實現人員的分級管 理的,給大家提供相應的思路和樣例參考。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved