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

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)--用户分级管理的更多相关文章

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

    在上篇总结随笔<Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用>介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司 ...

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

    最近一直在做一些技术性的研究和框架改进工作,博客也落下好几天没有更新了,也该是时候静下心来,总结这段时间的一些技术改进的经验了.和上一阶段的CRM系统开发和技术研究一样,我都喜欢在一个项目或者模块完成 ...

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

    在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...

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

    在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能.在一般权限系统里面,常见的黑名单就是禁止用户在某些IP上登录系统,白名单就是允许用户只在某些IP上登录系统.本随笔主要介绍在我的权 ...

  5. Winform开发框架之权限管理系统的改进

    权限管理系统,一直是很多Mis系统和一些常见的管理系统所需要的,所以一般可以作为独立的模块进行开发,需要的时候进行整合即可,不需要每次从头开发,除非特殊的系统需求.我在Winform开发框架介绍中的随 ...

  6. Winform开发框架之权限管理系统

    本文章转载:http://www.cnblogs.com/wuhuacong/archive/2011/05/08/2040620.html 至此,权限管理模块介绍已经完毕,下面给出一个调用例子Dem ...

  7. Web开发框架之权限管理系统

    Web开发框架之权限管理系统 记得我在很早之前,开始介绍我的Winform开发框架和我的WCF开发框架之初,我曾经给出下面的视图,介绍我整理的一个框架体系,其中包含有WInform开发框架以及我的We ...

  8. Winform开发框架之权限管理系统功能介绍

    权限管理系统的重要特性总结: 1) 高度集成的权限系统.独立模块,能快速整合使用.2) 符合权限的国际通用标准,基于RBAC(基于角色的访问控制)的角色权限控制.3) 多数据库架构支持,内置支持Sql ...

  9. ABP+AdminLTE+Bootstrap Table权限管理系统第十一节--Bootstrap Table用户管理列表以及Module Zero之用户管理

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 用户实体 用户实体代表应用的一个用户,它派生自AbpUser类,如下所示: public class User : ...

随机推荐

  1. Lists in Prolog

    Symbols in Prolog: atom variable number list (how to assembly and take them apart)   Lists are very  ...

  2. 3.C#中泛型类的进一步探讨

    阅读目录 一:多重泛型  class不仅可以有T,还可以有K,实例化的时候传多个数据类型的类型,C#集合类型中的Dictionary就是多重泛型 using System; using System. ...

  3. Jenkins 安装或更新插件失败

    试试这个插件网址是否可以在网页中打开 http://mirror.xmission.com/jenkins/updates/current/update-center.json   如可以,把这个网址 ...

  4. SQL SERVER 服务启动后停止,某些服务由其它服务或程序使用时将自动停止

    发生症状: 先是服务器挂掉,之后服务器可以登陆,但是实例却不能登陆进去(部分).出现的错误日志如下: :: R2 (SP2) - 10.50.4000.0 (X64) Jun :: Copyright ...

  5. Kafka 分区备份实战

    1.概述 在 Kafka 集群中,我们可以对每个 Topic 进行一个或是多个分区,并为该 Topic 指定备份数.这部分元数据信息都是存放在 Zookeeper 上,我们可以使用 zkCli 客户端 ...

  6. Quartz的线程池解析

    [org.quartz.core相关类图] 可以看到核心类为QuartzScheduler [QuartzScheduler构造函数] public QuartzScheduler(QuartzSch ...

  7. Spark源码系列(六)Shuffle的过程解析

    Spark大会上,所有的演讲嘉宾都认为shuffle是最影响性能的地方,但是又无可奈何.之前去百度面试hadoop的时候,也被问到了这个问题,直接回答了不知道. 这篇文章主要是沿着下面几个问题来开展: ...

  8. android自定义view仿照MIUI中音量控制效果

    先看效果图: 这就是miui中的音量效果图,实现思路是自定义视图,绘制圆环,然后设置进度显示. 核心代码在onDraw中实现如下: @Override protected void onDraw(Ca ...

  9. 网友对twisted deferr的理解

    事實上Deferred的確就像是一連串的動作,用callback的形式被串在一起,我們用deferred或許可以這樣寫 d.addCallback(洗菜)d.addCallback(切菜)d.addC ...

  10. pod install 错误 - incompatible character encodings: UTF-8 and ASCII-8BIT

    pod install [!] Invalid `Podfile` file: incompatible character encodings: UTF-8 and ASCII-8BIT. Upda ...