4.1 用户管理
用户是登录系统的楔子。
用户管理主要是针对平台的使用者进行管理。包括:
① 用户信息(帐号、密码、姓名等个人基本信息和状态、职位、职务等平台信息)
② 用户组设置、组织归属
③ 角色设定
④ 用户的模块资源授权和具体动作权限分配等。
用户管理的功能作业区(用户操作)界面如下图4.1-1所示,通过主要的操作按钮和信息内容可知其功能有:新增用户、编辑用户、删除用户、修改密码、设置角色、单独授权、组织调动、用户有效性、用户排序等。
其中,功能操作按钮的状态会根据选择的左侧树型中不同节点和不同登录用户的动作权限而改变。具有系统本身和权限系统的双重保证和控制。
图4.1-1 用户管理界面
4.1.1 新增、编辑和删除
新增用户:点击展开树形菜单“用户类型”,可以看到平台的各个组织结构和其对应组织目录(机构、部门)下的人员情况。选择一个组织(例如“系统管理”)后点击“新增”按钮,弹出如下图4.1.1-1中所示操作界面:
图4.1.1-1 新增用户
在新增用户的过程中,用户基础信息中带红色星号标记“*”的四项是必填内容:登录帐号,登录密码,用户姓名和排序ID。其中用户登录帐号除不能为空外,在平台中还具有物理和逻辑状态唯一性,用户密码也具有自动强度检测功能;可以指定用户状态(是否禁用),用户特性(是否内部用户),在高级选项卡中可以设置联系方式,证件号,职位,职务以及备注等高级内容。
private bool InsertorUpdateStaff() { if (dmeStaff == null) { dmeStaff = new DMESYS_STAFF(); } if (dmeOrgan == null) { dmeOrgan = new DMESYS_DEPARTMENT(); } if (action == Action.ADD) { if (DoValidatedStaff()) { dmeStaff.Department_Id = dmeOrgan.Id; DBOSYS_STAFF.InsertDMESYS_STAFF(dmeStaff); return true; } } if (action == Action.EDIT) { if (DoValidatedStaff()) { DBOSYS_STAFF.UpdateDMESYS_STAFF(dmeStaff); return true; } } return false; }
编辑用户:这里涉及到需要修改用户基本信息,职位变更,职务调动,排序,状态调整,证件修改等情况时进行的编辑操作。
点击展开树形菜单“用户类型”,在组织目录(机构、部门)下选择一个指定的用户(例如“超级管理员”)后点击“编辑”按钮,即可以编辑、修改具体的用户信息,编辑操作界面如下图4.1.1-2中所示:
图4.1.1-2 编辑用户
private void DirtyData() { lbtxtLoginId.Text = dmeStaff.Login_Id; lbtxtLoginId.ReadOnly = true; lbtxtPwd.Text = dmeStaff.Password; lbtxtPwd.ReadOnly = true; lbtxtName.Text = dmeStaff.Name; lbtxtOrder.Text = dmeStaff.Order_Id.ToString(); lbtxtRemark.Text = dmeStaff.Remark; wcbSex.SelectedIndex = dmeStaff.Sex == 1 ? 0 : 1; wcbPosition.SelectedIndex = FindKVPIndex(sysCodePosition, dmeStaff.Position_Tag) + 1; wcbTitle.SelectedIndex = FindKVPIndex(sysCodeTitle, dmeStaff.Title_Tag) + 1; lbtxtCode.Text = dmeStaff.Code; lbtxtCellphone.Text = dmeStaff.Cellphone; lbtxtEmail.Text = dmeStaff.Email; chkBoxDisabled.Checked = dmeStaff.Disabled == 0 ? false : true; chkIsInnerUser.Checked = dmeStaff.Is_Inner_User == 0 ? false : true; return; }
删除用户:如果需要对平台上的用户进行删除,点击展开树形菜单“用户类型”,在组织下选择一个用户后点击“删除”按钮,下图4.1.1-3中显示了删除用户操作的提示对话框界面。
备注:对于系统内置的超级管理员帐号是无法删除的;对于包含有权限或者角色的用户也是无法直接删除的,需要先取消其授权的资源。
图4.1.1-3 删除用户提示
if (selectedObj is DMESYS_STAFF) { if ((selectedObj as DMESYS_STAFF).Login_Id.ToUpper() == SADMIN) { GUIHelper.MessageToUserError("错误:无法删除超级管理员帐户!"); return; } if (DBOSYS_STAFF.IsAuthorized(selectedObj as DMESYS_STAFF)) { GUIHelper.MessageToUserInfo("提示:该职员包含权限,无法直接删除!"); return; } if (DBOSYS_STAFF.IsRoled(selectedObj as DMESYS_STAFF)) { GUIHelper.MessageToUserInfo("提示:该职员包含角色,无法直接删除!"); return; } if (GUIHelper.MessageQuestion("确定要删除职员“" + (selectedObj as DMESYS_STAFF).Name + "”吗?", "删除职员")) { DBOSYS_STAFF.DeleteDMESYS_STAFF(selectedObj as DMESYS_STAFF); btnRefresh_Click(sender, e); return; } }
4.1.2 修改密码
图4.1.2-1 修改密码
管理员也可以在后台直接初始化或者修改用户密码。点击展开树形菜单“用户类型”,在组织下选择一个用户(例如“超级管理员”)后点击“修改密码”按钮,弹出如上图4.1.2-1所示操作界面。
4.1.3 移动用户
平台上的用户在使用过程中可能由于工作中的某些原因如部门的变更、职位的调动或者是离职等情况,希望或需要修改他原来所属的组织机构,此时就需要涉及到用户的组织移动功能和操作。
点击展开树形菜单“用户类型”,在组织下选择一个用户(例如“超级管理员”)后点击“移动”按钮,如下图4.1.3-1所示,操作界面以动态树形方式列出了当前平台的系统组织结构,选择需要移动到的目标组织,点击确认,即可完成人员的调动。
图4.1.3-1 移动用户的组织归属
#region LoadDepartments(TreeNode currentNode, DMESYS_DEPARTMENT currentDept) private void LoadDepartments(TreeNode currentNode, DMESYS_DEPARTMENT currentDept) { List<DMESYS_DEPARTMENT> subDepartments = null; if (currentDept != null) subDepartments = DBOSYS_DEPARTMENT.GetSubDepartments(currentDept); else subDepartments = DBOSYS_DEPARTMENT.GetAllTopDepartments(); foreach (DMESYS_DEPARTMENT d in subDepartments) { TreeNode node = currentNode.ChildNodes.Add(); node.Tag = d; node.Text = d.Name; node.CollapsedImageIndex = 1; node.ExpandedImageIndex = 2; LoadDepartments(node, d); } } #endregion private bool MoveStaff() { if (destObj == null) { lbTip.Visible = true; return false; } if(destObj is DMESYS_DEPARTMENT) { DBOSYS_STAFF.MoveStaff(target, destObj as DMESYS_DEPARTMENT); return true; } return false; }
4.1.4 用户角色
或是为了系统安全性,或者为了是实际业务需求,平台上的用户通常涉及到需要设置对应的系统权限来控制其访问权限和拥有资源。
角色概念的出现和实际应用极大方便了平台权限资源的分配和管理,提高了权限分配的效率,减少了管理员重复设置权限的工作量。
具体关于角色的分类和权限的设置、分配可以参考前文中关于角色管理部分的详细描述。
点击展开树形菜单“用户类型”,在组织下选择一个用户(例如“测试”)后点击“角色”按钮,在出现的界面中以动态树形方式列出了当前平台的的角色结构。打开时系统会自动加载(显示为已勾选上)当前选中用户已经被分配或拥有的角色,如需变更该用户的角色,只要点击勾选或者取消勾选对应角色,点击确认,即可完成用户角色的设置。具体操作界面如下图4.1.4-1中所示:
图4.1.4-1 用户角色的设置
private void GrantedStaffRoles(TriStateTreeNode triStateNode) { foreach (TriStateTreeNode tn in triStateNode.Nodes) { if(tn.Checked && tn.Tag is DMESYS_ROLE) { DMESYS_STAFF_ROLE dme = new DMESYS_STAFF_ROLE(); dme.Login_Id = staff.Login_Id; dme.Role_Id = (tn.Tag as DMESYS_ROLE).Id; grantedStaffRoles.Add(dme); } GrantedStaffRoles(tn); } } private bool UpdateStaffRoles() { grantedStaffRoles.Clear(); GrantedStaffRoles(rootNode); DBOSYS_STAFF_ROLE.DeleteDMESYS_STAFF_ROLE(staff); foreach (DMESYS_STAFF_ROLE sr in grantedStaffRoles) { DBOSYS_STAFF_ROLE.InsertDMESYS_STAFF_ROLE(sr); } return true; }
4.1.5 用户授权
在实际工作和应用中,政府、企业和单位对管理要求在不断的变化和提高,相应的权限管理的需求就会经常调整或变动。比如时常需要调整角色的具体权限分配、设置或取消用户的某些角色,为了不同用户细微的权限区别就设置了多种角色等等。这些都给权限管理带了不便。合理的权限粒度抽象才能方便后期的管理。
该用户授权功能就是为了方便用户权限的独立授权和管理而开发的。用户可访问的模块资源与相应的操作动作权限在本平台上可根据不同用户进行独立授权。
当单一的角色概念已经不能满足或者不足以适应多变的业务需求时,就目前来说,更细粒度、更深的方向的资源分配和权限控制理念弥补了这一缺失,很好的增强了权限管理的灵活性和可扩展性。
为了更好的保证指定资源和权限能有效的允许和禁止,系统可以对相容或不相容(互斥)的资源和权限进行分离,对重要的资源和权限进行独立的授予和制约,重点突出了安全化、精细化管理的要求。比如可以分配或禁止指定用户模块资源的访问权限、可以授予或者收回指定用户的操作动作权限等。
这或许不是一个独创的理念,但肯定是一个可以看得见效果的突破和飞跃。完全做到了允许和禁止所有层面的资源访问和行为动作。同时,系统以禁止授权高于允许授权的优先等级制度,有效的做到了权限资源的细粒度分发和回收。
点击展开树形菜单“用户类型”,在组织下选择一个用户(例如“演示”)后点击“授权”按钮,在出现的界面中以动态树形方式列出了当前平台中所有模块和对应动作的资源结构。该资源结构是根据模块管理的相关配置加载的,模块允许的权限动作都会在该资源结构中加载。打开页面时会自动加载(显示为已勾选上)当前选中用户已经分配拥有的模块资源和权限动作。点击勾选或者取消勾选对应的模块资源和权限动作,点击确认,即可完成对用户的独立授权。具体操作界面如下图4.1.5-1中所示:
图4.1.5-1 用户授权
private void ConfigureTreeView() { rootNode.CheckboxVisible = false; rootNode.IsContainer = true; rootNode.ImageIndex = 0; rootNode.SelectedImageIndex = 0; rootNode.Expand(); tvStaffModule.SuspendLayout(); tvStaffModule.Nodes.Add(rootNode); LoadModuleTypes(rootNode, null); LoadModules(); LoadGrantedModuleRights(rootNode); UpdateNodesState(rootNode); tvStaffModule.ResumeLayout(); } private void AuthorizeStaffRights(TriStateTreeNode triStateNode) { foreach (TriStateTreeNode tn in triStateNode.Nodes) { if (tn.ImageIndex == 7 && tn.CheckState == System.Windows.Forms.CheckState.Checked) { DMESYS_STAFF_MODULE_RIGHT_GRANT mr = new DMESYS_STAFF_MODULE_RIGHT_GRANT(); mr.Right_Id = tn.Name; mr.Login_Id = staff.Login_Id; smrGranted.Add(mr); } AuthorizeStaffRights(tn); } } private bool UpdateGrantedRoleRights() { bool flag = false; smrGranted.Clear(); AuthorizeStaffRights(rootNode); DBOSYS_STAFF_MODULE_RIGHT_GRANT.DeleteDMESYS_STAFF_MODULE_RIGHT_GRANT(staff); foreach (DMESYS_STAFF_MODULE_RIGHT_GRANT mrg in smrGranted) { DBOSYS_STAFF_MODULE_RIGHT_GRANT.InsertDMESYS_STAFF_MODULE_RIGHT_GRANT(mrg); flag = true; } return flag; }