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、用户分级管理的界面显示
用户分级,前面说到,分为了超级管理员和公司管理员,超级管理员用来管理整个系统的相关用户以及全局的设置;公司管理员用来管理分公司的人员信息。
我们使用超级管理员登陆权限管理系统,可以看到权限系统的全部功能,超级管理员的界面效果如下所示。
公司管理员登陆权限系统后,主界面效果如下所示。其中我们可以看到,对于功能、菜单的定义模块,公司管理员没有权限进行配置,而且用户仅仅能够管理属于自己公司的人员,如下所示 。
角色管理也是只能管理所属公司的角色信息,如下所示。
其他模块,也是只能根据自己公司范围进行查找,如操作日志,登陆日志等信息。
相关文章
- 【kubernetes入门到精通】Kubernetes的健康监测机制以及常见ExitCode问题分析「探索篇」
- 【世界杯黑技术专题】「原理探索专题」一文解读一下“卡塔尔世界杯”的先进技术之半自动越位技术SAOT+比赛用球Al Rihla
- Mp3文件标签信息读取和写入(Kotlin)
- Maven项目不同jar包相同类名的引用问题
- Libgdx游戏开发(2)——接水滴游戏实现
- Libgdx游戏开发(1)——环境配置及demo运行
- Jetpack架构组件学习(4)——APP Startup库的使用
- Kotlin学习快速入门(10)—— 重载运算符使用
- Kotlin学习快速入门(9)—— 密封类的使用
- Jetpack Compose学习(9)——Compose中的列表控件(LazyRow和LazyColumn)
- Jetpack Compose学习(8)——State及remeber
- Kotlin学习快速入门(8)—— 委托
- Kotlin学习快速入门(7)——扩展的妙用
- Jetpack架构组件学习(3)——Activity Results API使用
- TornadoFx实现侧边栏菜单效果
- TornadoFx中的css美化
- TornadoFx设置保存功能(config和preference使用)
- 关于百分百浏览器(cent browser)无法使用QQ快捷登录问题
- 关于Jitpack发布aar,会丢失内置依赖库问题
- 【stars-one】星之音乐下载器