Winform开发框架之权限管理系统改进的经验总结(4)--用户分级管理

在实际的系统应用环境中,用户的分级管理一般也是比较常见的功能,小的业务系统可以不需要,但是一般涉及到集团、分子公司、或者是事业单位里面的各个处室或者某某局的人员管理,这些分级管理就显得比较必要,否则单靠管理员来处理账号的事情,是比较麻烦一点的。分级管理就是让不同层次、不同机构的人员实现一定的自治管理,如分公司的人员有专门的管理员,各地区的处室或者某某局实现内部人员的创建、调整、角色分配等工作。本篇随笔主要介绍在我的权限系统中如何实现人员的分级管理的,给大家提供相应的思路和样例参考。

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、用户分级管理的界面显示

用户分级,前面说到,分为了超级管理员和公司管理员,超级管理员用来管理整个系统的相关用户以及全局的设置;公司管理员用来管理分公司的人员信息。

我们使用超级管理员登陆权限管理系统,可以看到权限系统的全部功能,超级管理员的界面效果如下所示。

公司管理员登陆权限系统后,主界面效果如下所示。其中我们可以看到,对于功能、菜单的定义模块,公司管理员没有权限进行配置,而且用户仅仅能够管理属于自己公司的人员,如下所示 。

角色管理也是只能管理所属公司的角色信息,如下所示。

其他模块,也是只能根据自己公司范围进行查找,如操作日志,登陆日志等信息。

 本文转自博客园伍华聪的博客,原文链接:Winform开发框架之权限管理系统改进的经验总结(4)--用户分级管理,如需转载请自行联系原博主。

时间: 2024-10-03 14:52:59

Winform开发框架之权限管理系统改进的经验总结(4)--用户分级管理的相关文章

Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操作,如果能在框架层面的支持基础上,以最少的代码实现重要表的日志记录,那么是一件非常值得庆贺的事情,也能够为我们客户的数据提供重要的日志跟踪,甚至是数据恢复的参考. 1.数据访问层的对象继承关系 首先,为了减少重复代码的编写,合理的继承关系是必要的,我们需要在数据访问层上建立合理的继承关系,如下是我的

Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计

在上篇总结随笔<Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用>介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司.所属部门.直属经理(人员列表)的几级数据级联的展示,通过引入TreeListLookupEdit控件,能增强用户的体验效果.本篇继续介绍权限系统模块中的一些闪光点,介绍组织机构管理里面选择用户的界面设计和实现,用户选择在很多场合会用到,如组织机构的用户选择,角色里面的用户选择,或者流程里面的用户选择等用途.

Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用

最近一直在做一些技术性的研究和框架改进工作,博客也落下好几天没有更新了,也该是时候静下心来,总结这段时间的一些技术改进的经验了.和上一阶段的CRM系统开发和技术研究一样,我都喜欢在一个项目或者模块完成后,做一些相关的总结性工作,记录下前一阶段的技术脚印,希望给自己留下一个脚印快照,同时给读者了解自己的技术动向外,也有所收获.本随笔主要介绍在下拉列表中展示一个列表,以便实现数据结构的良好展示,并能快速选定所需的节点,这个就是TreeListLookupEdit控件的使用. 1.界面效果展示 首先我

Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现

在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能.在一般权限系统里面,常见的黑名单就是禁止用户在某些IP上登录系统,白名单就是允许用户只在某些IP上登录系统.本随笔主要介绍在我的权限系统里面,如何实现这个黑白名单的功能,以及介绍在其中应用到的IP对比操作,IP段判断等操作代码. 1.黑白名单的配置 要完成黑名单的拦截和白名单的放行,我们需要进行名单的配置操作,我们把相关的配置放到列表里面进行展示,可以添加多个黑名单或者白名单,如下界面所示. 可以单击新建按钮进行添加一条记录,

Winform开发框架之权限管理系统改进的经验总结(1)TreeListLoo

最近一直在做一些技术性的研究和框架改进工作,博客也落下好几天没有更新了,也该是时候静下心 来,总结这段时间的一些技术改进的经验了.和上一阶段的CRM系统开发和技术研究一样,我都喜欢在一 个项目或者模块完成后,做一些相关的总结性工作,记录下前一阶段的技术脚印,希望给自己留下一个 脚印快照,同时给读者了解自己的技术动向外,也有所收获.本随笔主要介绍在下拉列表中展示一个列 表,以便实现数据结构的良好展示,并能快速选定所需的节点,这个就是TreeListLookupEdit控件的使 用. 1.界面效果展

Winform开发框架之权限管理系统改进的经验总结(5) 用户分级管理

在实际的系统应用环境中,用户的分级管理一般也是比较常见的功能,小的业务系统可以不需要,但 是一般涉及到集团.分子公司.或者是事业单位里面的各个处室或者某某局的人员管理,这些分级管理 就显得比较必要,否则单靠管理员来处理账号的事情,是比较麻烦一点的.分级管理就是让不同层次. 不同机构的人员实现一定的自治管理,如分公司的人员有专门的管理员,各地区的处室或者某某局实现 内部人员的创建.调整.角色分配等工作.本篇随笔主要介绍在我的权限系统中如何实现人员的分级管 理的,给大家提供相应的思路和样例参考. 1

Winform开发框架之权限管理系统改进的经验总结(4)

一行代码实现表操作日志记录 在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代 码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加 .修改.删除等关键的操作,如果能在框架层面的支持基础上,以最少的代码实现重要表的日志记录, 那么是一件非常值得庆贺的事情,也能够为我们客户的数据提供重要的日志跟踪,甚至是数据恢复的参 考. 1.数据访问层的对象继承关系 首先,为了减少重复代码的编写,合理的继承关系是必要的,我们需要在数据访

Winform开发框架之权限管理系统改进经验总结(2)用户选择界面的设计

在上篇总结随笔<Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件 的使用>介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司.所属部门.直属 经理(人员列表)的几级数据级联的展示,通过引入TreeListLookupEdit控件,能增强用户的体验效果 .本篇继续介绍权限系统模块中的一些闪光点,介绍组织机构管理里面选择用户的界面设计和实现,用 户选择在很多场合会用到,如组织机构的用户选择,角色里面的用户选择,或者流程里面的用户选择

Winform开发框架之权限管理系统改进经验总结(3)系统登录黑白名单的实现

在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能.在一般权限系统里面 ,常见的黑名单就是禁止用户在某些IP上登录系统,白名单就是允许用户只在某些IP上登录系统.本随 笔主要介绍在我的权限系统里面,如何实现这个黑白名单的功能,以及介绍在其中应用到的IP对比操作 ,IP段判断等操作代码. 1.黑白名单的配置 要完成黑名单的拦截和白名单的放行,我们需要进行名单的配置操作,我们把相关的配置放到列表里 面进行展示,可以添加多个黑名单或者白名单,如下界面所示. 开发框架之权限管理系统改进