一、权限系统基本概述
本文档描述了C/S系统快速开发框架旗舰版V5.0权限管理模块详细功能设计,权限实现原理、系统架构设计、数据库设计、功能测试以及实施方案等。
1.1 权限管理简单定义
权限管理是后台系统都会涉及的一个重要组成部分,主要目的是对整个后台管理系统进行权限的控制,针对对象是使用该系统的用户或员工,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,数据泄露等问题。根据系统设置的安全规则或策略,用户可以访问而且只能访问自己被授权的资源。
C/S系统快速开发框架权限管理是一个账号对应多个角色,每个角色对应相应的权限集RBAC模型,且通过角色可以实现灵活且多样的的权限操作需求。
1.2 权限类型
基于角色的访问权限控制(RBAC)模型,赋予用户的权限管理,可以分为三大类型:
功能权限
角色的定义对模块和功能能否有执行权限,功能是系统执行权限控制的基本单元。
可以操作的功能不同,保证系统安全,避免操作风险。
数据权限
权限的定义对功能涉及到的数据是否有增删查改的权限,能否查看与编辑系统相关数据。
保证数据隐私,避免数据泄密。
界面权限
账号的定义对控制字段的可见性,可编辑性,用户可以看到的页面进行限制,职责不同所需要页面不同,保证操作效率,避免页面干扰。
1.3 RBAC模型
1.3.1 基于角色的访问控制
RBAC(Role-Based Access Control)基于角色的访问控制。成熟的权限模型强调三个要素:用户、角色、权限,用户与角色是多对多关系,角色与权限是多对多关系。RBAC是以“用户”为单位的权限设计,以“权限”为单位的权限设计,以“用户”与“权限”结合的权限设计。
权限设计:用户与角色逻辑关系图:
RBAC模型特点:
把权限赋予角色,再把角色赋予用户。
用户和角色,角色和权限都是多对多的关系。
用户拥有的权限等于所有的角色的权限之和。
1.3.2 基于RBAC的用户组
基于RBAC模型,适当延展增加用户组概念,直接给用户组分配角色,再把用户加入用户组,这样用户除了拥有自身的权限外,还拥有了所属用户组的所有权限。用户组权限是粗狂式设计,不能友好的细分权限。
1.4 C/S系统开发框架窗体权限控制
C/S快速开发框架的权限控制对象:功能菜单、数据窗体、功能按钮。
功能界面是点击菜单或点击按钮打开的,因此权限控制首先是控制菜单。当用户点击菜单打开界面后,系统会分析当前用户的权限以及对界面的组件进行控制,如控制按钮、表格列、界面组件是否显示或禁用等。
1.4.1 开发框架数据窗体分类
数据窗体分为两类:
a)数据字典窗体. 继承基类:frmBaseDataDictionary
b)业务单据窗体. 继承基类:frmBaseBusinessForm
1.4.2 按钮(功能点)指定权限值
为了方便给用户分配权限以及进行权限控制,C/S系统快速开发框架针对窗体中每个功能按钮或功能点分配一个特殊的数字编号(计算机二进制数据的数值),该数值分别对应2^n次方,如0,1,2,4,8,16,32,64,128,256,512,1024。。。32位的硬件系统最多支持2^32次方,64位的硬件系统最多支持2^64次方。
若【X】按钮分配的数值为0,则该按钮或功能点不受权限控制,任何用户都可访问。
若【X】按钮分配的数值为1,只有拥有1权限的用户才能访问。
1.4.3 窗体的基本权限
数据字典窗体的基本功能权限:增、删、改、查、打印、预览。
C# Code:
///
/// 数据字典拥有的功能(增、删、改、查、打印、预览)
///
public const int MASTER_ACTION = DATA_ACTION_VALUE + REPORT_ACTION_VALUE;
///
/// 数据字典拥有的功能(增、删、改、查、打印、预览)
///
public const int MASTER_ACTION = DATA_ACTION_VALUE + REPORT_ACTION_VALUE;
业务单据窗体的基本功能权限:增、删、改、查、打印、预览、审核、修改历史。
C# Code:
///
/// 业务单据拥有的功能(增、删、改、查、打印、预览、审核、修改历史)
///
public const int BUSINESS_ACTION_VALUE = DATA_ACTION_VALUE + REPORT_ACTION_VALUE +
ButtonAuthority.APPROVAL +
ButtonAuthority.SHOW_MOD_HISTORY;
///
/// 业务单据拥有的功能(增、删、改、查、打印、预览、审核、修改历史)
///
public const int BUSINESS_ACTION_VALUE = DATA_ACTION_VALUE + REPORT_ACTION_VALUE +
ButtonAuthority.APPROVAL +
ButtonAuthority.SHOW_MOD_HISTORY;
1.5 二进制的逻辑运算
二进制是计算技术中广泛采用的一种数制,二进制数据是用0和1两个数码来表示的数。
二进制数的运算除了有【四则运算】外,还可以进行【逻辑运算】,下面分别予以介绍。
1.5.1 二进制四则运算
二进制数与十进制数一样,同样可以进行加、减、乘、除四则运算,其算法规则如下:
加运算:0+0=0,0+1=1,1+0=1,1+1=10(逢2进1)
减运算:1-1=0,1-0=1,0-0=0,0-1=1(向高位借1当2)
乘运算:0×0=0,0×1=0,1×0=0,1×1=1(只有同时为“1”时结果才为“1”)
除运算:0÷1=0,1÷1=1,二进制数只有两个数(0,1),因此它的商是1或0。
1.5.2 二进制的逻辑运算
逻辑运算又称布尔运算。
表示方法有:"或"/"OR"、"与"/"AND" 、"非"/"Xor"、"等"/"="。
1和0表示"真"和"假"。
And:同为真时为真。如:1 AND 1=1,1 AND 0=0。
Or:同为假时为假。如:0 OR 0=0,1 OR 0=1, 1 OR 1=1。
Xor:相同为假。如:1 XOR 1=0, O XOR O=0, 0 XOR 1=1。
二 权限系统功能模块介绍
C/S系统快速开发框架权限系统是基于菜单管理+功能按钮+系统用户+角色岗位+组织机构等多个数据维度构成,满足大多数桌面管理应用系统的需求。
2.1 功能模块构成
2.2 用户管理 (User Management)
用户管理是指管理与维护软件系统的使用者,用户管理就是给公司或企业人员进行系统登记,一般是由系统管理员进行登记,经登记的使用者及分配系统使用权限才能登入系统。
用户管理中的用户主要是软件系统的使用者。
2.3 角色/岗位 (Role Management)
角色是基于业务管理需求而预先在系统中设定好的,每个角色对应明确的系统权限,角色也不会随着用户的被添加和被移除而进行改变,只有分配用户的角色才有实际意义。对于企业管理人员而言,角色与岗位相同,如仓管员、调度员、系统管理员、采购员、会计、出纳等都是企业组织架构中的岗位,对于管理应用系统,如ERP系统,岗位既ERP系统中的角色。
2.4 组织机构权限管理 (Group Management)
C/S系统快速开发框架中的组织机构权限是指组权限(Group)。用户管理中的用户主要是指软件系统的使用者,把一个或多个用户归类在一起形成一个群体或小组,构成软件系统的用户组。把用户分组后,组用户成员拥有相同的权限等级。
2.5 系统菜单管理 (System Menu Management)
系统菜单即菜单栏,由若干个下拉菜单组成,每个下拉菜单包含一组菜单命令,对应打开不同的窗口或执行不同的命令,若菜单的内容能跟随业务逻辑变化,所以也被称为“动态菜单”。
针对功能菜单来划分用户权限其实是比较粗颗粒度的一种管理方式,用户获得授权即可使用该菜单栏下的全部数据查看权限和功能操作权限。
2.6 临时权限
临时角色是针对特殊用户群体设置的,通常会设置角色的过期时间,一般并没有固定角色符合拥有客户所需的全部操作权限,因此需要开设临时角色,并且支持给临时角色最大的权限选择空间。
2.7 批量设置用户和角色
批量设置用户和角色功能是针对用户组管理开发的一个辅助功能,把设置用户和角色采用复选框的方式,提高界面用户体验。
四 权限系统实现原理
本文将描述基于功能按钮权限控制的基本实现原理,在学习权限系统实现原理之前,请先看下面的流程图:
【当前用户】:是指当前登录系统的用户(软件使用者)。
【点击菜单】:用户点击界面上面的菜单栏或左侧导航菜单。用户能查看或点击的菜单项代表当前用户拥有此菜单的权限。
【打开界面】:用户点击菜单执行事件并成功打开功能窗体,触发初始化界面(Form_Load)事件,开发框架底层将根据当前用户的权限进行按钮控制,有按钮权限则显示按钮,无权限的则不创建或隐藏按钮。
【按钮控制】:下面将重点讲解界面的按钮权限控制实现原理。
4.1 按钮权限控制基本原理
以数据字典窗体【员工管理】举例说明,假设【员工管理】拥有以下按钮及对应的权限值:
模拟场景:
用户【User-孙】属于【Role1】角色, 在【角色管理】界面内给【Role1】角色分配【员工管理】窗体的权限为:(1,2,4,8)=15,勾选【新增】、【删除】、【修改】、【查看】功能, 用户【User-孙】登录后取到【员工管理】窗体的权限值为1+2+4+8=15. 在打开【员工管理】窗体时, 框架底层对【员工管理】窗体的每个按钮分别与当前用户的权限值15进行逻辑【与】运算。
逻辑【与】运算结果如下:
在Form.Load事件内调用InitButtons方法,有权限的按钮则Button.Enable=True, 无权限的按钮则Button.Enable=False;
4.2 逻辑“与”运算C#代码参考
相关C#代码参考:
ButtonAuthorized方法主要是进行逻辑“与”运算:
参考文档:
Winform通用框架(C#.NET)之权限管理系统详细设计|C/S框架网
http://www.csframework.com/archive/1/arc-1-20190129-2582.htm
本文转自C/S框架网:http://www.csframework.com