概述
基于角色的用户权限管理系统(RBAC)是目前公认的解决大型企业的统一资源访问控制的有效方法。
本套权限管理组件不局限于传统的权限,角色,用户三者的关系,在减小授权管理的复杂性基础上,通过独特的允许、禁止资源控制思想,增强了授权的灵活性。既可以按照角色统一授权,也可以对人员独立授权。权限可粗粒度的分为模块权限,亦可细化到具体操作资源和功能(菜单、按钮、数据)。能够指根据系统管理员设置的安全规则或者安全策略,能够达到使用户可以访问且只能访问自己被授权的资源,并拒绝访问被禁止的指定资源。
平台配合提供了业务系统常用字典管理功能,可通过可视化的操作和维护,能快速操作平台上的字典数据。整个数据字典数据为框架平台所共享,有效提高了数据的重复利用率和产品、项目的开发效率。
这是一套通用的权限组件框架,适用于C/S、B/S架构的企业级应用系统。提供了基础的权限控制和资源管理功能,因此可以作为业务系统、办公系统或门户网站系统的实现参考指南,也可以通过调用该系统组件中的接口来完成集成。
主要包括以下功能模块:系统代码管理、模块管理、角色管理、组织管理、职员管理和用户信息管理。
功能导航区(用户模块)如下图4-1所示:
图4-1 权限管理功能导航区
4.3 组织管理
有人的地方,就有江湖。
组织管理或许是权限管理系统中四大模块里最容易理解和实现的内容。
从广义上说,组织是指由诸多要素按照一定方式相互联系起来的系统。
从狭义上说,组织就是指人们为实现一定的目标互相协作结合而成的集体或团体。狭义的组织专门指人群而言,运用于社会管理之中。在现代社会生活中.组织是人们按照一定的目的、任务和形式编制起来的社会集团,组织不仅是社会的细胞、社会的基本单元,而且可以说是社会的基础。
从管理学的角度来说,组织是人们为了某一目的而形成的群体,是确保人们社会活动正常协调进行、顺利达到预期目标的体系。
它按照一定的规则和程序构成的一种责权结构安排和人事安排,其目的在于确保以最高的效率实现组织目标。组织管理模块提供直观、方便的组织机构管理,以树型结构的可视化形式显示了各组织之间(机构、部门)的关系。
组织(机构、部门)管理的功能作业区(用户操作)界面如下图4.3-1所示,通过主要的操作按钮和信息内容可知其功能有:新增组织,编辑组织,删除组织,移动组织,组织排序等。其中功能操作按钮的状态会根据选择的左侧树型中不同节点和不同登录用户的动作权限而改变。平台在理论和实现上支持了无限递归的树型组织结构,可根据实际需要进行添加、修改、删除或移动等对组织机构进行调整处理。
图4.3-1 组织管理界面
树形的组织机构代码核心算法主要由以下代码完成:
1 #region LoadDepartments 2 private void LoadDepartments(TreeNode currentNode, DMESYS_DEPARTMENT currentDept) 3 { 4 List<DMESYS_DEPARTMENT> subDepartments = null; 5 if (currentDept != null) 6 subDepartments = DBOSYS_DEPARTMENT.GetSubDepartments(currentDept); 7 else 8 subDepartments = DBOSYS_DEPARTMENT.GetAllTopDepartments(); 9 10 foreach (DMESYS_DEPARTMENT d in subDepartments) 11 { 12 TreeNode node = currentNode.ChildNodes.Add(); 13 node.Tag = d; 14 node.Text = d.Name; 15 node.CollapsedImageIndex = 1; 16 node.ExpandedImageIndex = 2; 17 18 LoadDepartments(node, d); //递归 19 } 20 } 21 #endregion
该算法主要是通过递归的方式加载组织机构的树形菜单。
组织机构的数据模型层DML中实体类都实现了序列化,实体类DMESYS_DEPARTMENT具体实现定义代码如下:
1 [Serializable, Class("DMESYS_DEPARTMENT", "Id")] 2 public class DMESYS_DEPARTMENT : DMEBase, IEquatable<DMESYS_DEPARTMENT> 3 { 4 #region Private Members 5 private string _id; 6 private string _parent_id; 7 ......... 194 }
组织机构的数据访问层DAL中访问操作类都实现了序列化,访问操作类DBOSYS_DEPARTMENT具体实现定义代码如下:
1 public class DBOSYS_DEPARTMENT 2 { 3 /// <summary> 4 /// 获取所有顶层的部门实例。 5 /// </summary> 6 /// <returns>所有顶层的部门实例。</returns> 7 public static List<DMESYS_DEPARTMENT> GetAllTopDepartments() 8 { 9 string sql = "SELECT * FROM SYS_DEPARTMENT WHERE Parent_id IS NULL OR Parent_id = ‘‘ ORDER BY Order_id"; 10 List<DMESYS_DEPARTMENT> deptList = new List<DMESYS_DEPARTMENT>(); 11 List<IIdentifiedBase> iIBList = new List<IIdentifiedBase>(); 12 DataTable dt = DBMsSqlManager.ExecuteDataTable(sql, DBOService.GetTableName(typeof(DMESYS_DEPARTMENT))); 13 iIBList = DBOService.DataTable2DMEList(dt, typeof(DMESYS_DEPARTMENT)); 14 foreach (IIdentifiedBase iIB in iIBList) 15 { 16 deptList.Add(iIB as DMESYS_DEPARTMENT); 17 } 18 return deptList; 19 } 20 21 /// <summary> 22 /// 获取子部门。 23 /// </summary> 24 /// <param name="parentDept">指定部门</param> 25 /// <returns>所有子部门实例</returns> 26 public static List<DMESYS_DEPARTMENT> GetSubDepartments(DMESYS_DEPARTMENT parentDept) 27 { 28 string subSql = String.Format("SELECT * FROM SYS_DEPARTMENT WHERE Parent_id = ‘{0}‘ ORDER BY Order_id", parentDept.Id); 29 List<DMESYS_DEPARTMENT> subDeptList = new List<DMESYS_DEPARTMENT>(); 30 List<IIdentifiedBase> subIIBList = new List<IIdentifiedBase>(); 31 DataTable subdt = DBMsSqlManager.ExecuteDataTable(subSql, DBOService.GetTableName(typeof(DMESYS_DEPARTMENT))); 32 subIIBList = DBOService.DataTable2DMEList(subdt, typeof(DMESYS_DEPARTMENT)); 33 foreach (IIdentifiedBase subIIB in subIIBList) 34 { 35 subDeptList.Add(subIIB as DMESYS_DEPARTMENT); 36 } 37 return subDeptList; 38 }
4.3.1 新增、编辑和删除
平台自带了一个根节点“组织机构”的概念,所有的组织(机构、部门、单位)都是该节点的子节点。组织机构并不是真实存在的顶级组织,无可操作意义。
对于组织机构的操作动作,在权限系统中定义了如下的枚举类型,能够有效的对操作进行统一判断:
1 namespace FoQus.Rights 2 { 3 public enum Action 4 { 5 /// <summary> 6 /// 新增 7 /// </summary> 8 ADD, 9 /// <summary> 10 /// 编辑 11 /// </summary> 12 EDIT, 13 /// <summary> 14 /// 移动 15 /// </summary> 16 MOVE, 17 /// <summary> 18 /// 删除 19 /// </summary> 20 DELETE 21 } 22 }
新增组织:点击展开树形菜单“组织机构”,可以看到平台的各个组织目录(机构、部门、单位)之间的情况。选择根节点组织机构或者一个平台已有组织后点击“新增”按钮,弹出如下图4.3.1-1中所示操作界面:
图4.3.1-1 新增组织
在新增组织的过程中,组织基础信息中带红色星号标记“*”条目的名称和排序ID是必填内容。另外可以设置联系方式以及备注等内容。
编辑组织:这里主要是当涉及到需要修改组织基本信息(如组织名称、排序位置、联系方式、备注)时进行的编辑操作。
点击展开树形菜单“组织机构”,在组织目录(机构、部门)下选择一个已有的组织后点击“编辑”按钮,具体操作界面如下图4.3.1-2中所示:
图4.3.1-2 编辑组织
删除组织:如果需要对平台上的组织进行删除,点击展开树形菜单“组织机构”,在组织下选择一个组织后点击“删除”按钮,下图4.3.1-3中显示了几个典型的删除组织操作时的提示对话框界面。
备注:对于拥有子组织的组织是无法直接删除的,首先需要删除下级组织;如果该组织目录有下属人员时,也将无法直接删除。
图4.3.1-3 删除组织提示
4.3.2 移动组织
平台上的组织在工作生产过程中可能会发生归属或者分组的变更,此时就需要涉及到对组织进行移动操作。
点击展开树形菜单“组织机构”,选择一个组织后点击“移动”按钮,如下图4.3.2-1所示,界面以动态树形方式列出了当前平台的组织结构,选择需要移动到的目标组织,点击确认,即可完成组织归属关系的调动。
图4.3.2-1 移动组织
移动组织机构主要分为两大动作,首先判断移动目标的有效性,然后完成组织信息的更新。具体代码如下:
1 private void TargetContainsDest(DMESYS_DEPARTMENT target, DMESYS_DEPARTMENT dest) 2 { 3 4 List<DMESYS_DEPARTMENT> subDepts = DBOSYS_DEPARTMENT.GetSubDepartments(target); 5 if (subDepts.Count > 0) 6 { 7 foreach (DMESYS_DEPARTMENT d in subDepts) 8 { 9 if (d.Id == dest.Id) 10 { 11 flag = true; 12 break; 13 } 14 if (DBOSYS_DEPARTMENT.GetSubDepartments(d).Count > 0) 15 { 16 foreach (DMESYS_DEPARTMENT d2 in subDepts) 17 { 18 TargetContainsDest(d2, dest); 19 } 20 } 21 } 22 } 23 } 24 25 private bool MoveDepartment() 26 { 27 if (tvOrgan.SelectedNode == tnRoot) 28 { 29 target.Parent_Id = ""; 30 DBOSYS_DEPARTMENT.UpdateDMESYS_DEPARTMENT(target); 31 return true; 32 } 33 34 if (destObj != null) 35 { 36 DMESYS_DEPARTMENT dest = destObj as DMESYS_DEPARTMENT; 37 TargetContainsDest(target, dest); 38 if (target.Id != dest.Id && !flag) 39 { 40 target.Parent_Id = dest.Id; 41 DBOSYS_DEPARTMENT.UpdateDMESYS_DEPARTMENT(target); 42 return true; 43 } 44 if (target.Id == dest.Id || flag) 45 { 46 lbTip.Visible = true; 47 } 48 } 49 lbTip.Visible = true; 50 return false; 51 }