1引言
1.1目的
在管理类软件中,权限的作用非常重要。例:CRM(客户资源管理)软件中,假设有两个销售部门A和B,分别由经理a和经理b管理,要求a的权限可以查看A和B两个部门的客户信息,而b的权限却仅要求查看b部门的信息,这就需要对a和b进行权限分配,因为他们有所不同,假设两个经理的权限完全一致,又如何做到快速的设置呢?
1.2开发环境
采用微软Windows系统列操作系统即可,本人采用的是XP系统
1.3开发工具
Windows环境下,开发数据库的编程工具众多,其中,最突出的是微软公司的Net产品,尤以C#.2005为突出工具,在经过市场分析后,我们最终选择了微软的产品,采用C#.2005开发,数据库选择SQLServer2000或SQLServer2005。
1.4适用范围
部分行业的中小型企业,支持CS结构软件。BS结构很少做过,不是完全支持。大型和超大型企业的权限设置无法支持。
1.5个人资料
在此处写明个人资料,目的是告诉大家我这篇文档的水平。只是把经验分享给大家,并不是表明我有多牛X。
本人05年本科毕业,工作前两年,一直从事ERP实施工作,后来由于与自己兴趣不符,辞职闪人。
07年4月投身于杭州一家ERP公司,使用PowerBuilder9开发工具开发,由于本人对NET工具有强烈的兴趣,于09年4月合同到期,没有续约。
虽然没有使用NET工具开发,但我积累了行业管理软件方面的经验,为以后在NET工具上开发管理类软件提供很多启示。
因此,这篇文档主要是在PB工具上得到了验证,在NET工具上还在开发中,没有完全验证。
2功能设计-权限设置
2.1名词解释
2.1.1工作组
简单说,与一般企业的里的部门相似,例采购部门、销售部门等。考虑过直接使用HR(人力资源)模块的部门(也可以叫职能机构)表,但后来考虑到通用性,还是单独再建一张表。不过,考虑到项目不同和企业规模不同,可以将HR的部门表直接拿来使用。
2.1.2角色
这个名词是我在最近才加上去的,一开始感觉这个没有多大作用,所以就没有在权限设计中加入这个东东。直到最近在博客园浏览贴子的时候,才融入进设计中。
角色是依附于工作组的,同时还街接着用户。作用是承上启下的作用。
2.1.3操作员
相信大家都不会对这个名词陌生,没有必要再过多解释。不过,这个操作员和工作组一样,也是独立出来的一张表。不过,考虑到不同的项目和企业规模不同,该表可以与HR模块的人员档案合二为一,个人推荐不要这样设计。
2.1.4权限类别
把权限分门户别类,可能有些牵强,尤其是在中国,什么事都可能发生。权限类型的划分,我是分为两大类,几小类。
两大类,是指功能权限和数据权限。
功能权限,就是指新增、修改、删除、保存等产品常用的功能。
数据权限,这个有些牵强,就是指某些人能看到某些数据,不能看到某些数据,我认为这也是权限的一部门。如果再需要细分的话,可以按窗体的功能划分,如:列表权限、单据权限等
2.1.5权限级别
工作组,对整个工作组进行设置
角色,对某一角色进行设置
用户,对某一用户进行设置
他们的作用,逐级增强。即:用户的设置优于角色级别,角色的级别优于工作组。
2.1.6模块ID
这个名词本身是属于“框架”的范畴,因为在此处有所涉及,所以略微表述一下。大家理解为窗体的一个属性就可以了。
2.2设计方案
2.2.1设计思路
u 功能权限
何为“权限通用”呢,我的理解就是权限的设置不必根据前台是什么,而全部可以通过在后台数据库表或外部文件设置。在前台直接绑定(调用)就可以了。
其实即使我们说做到了“权限通用”也是有一定条件的,是根据某些行业的特点设计的。
还要再说一下前台,无论我们使用WinForm、WebForm开发,前台都可以理解为窗体或页面。在窗体或页面,会有菜单、工具栏、若干按钮,状态栏等。我把窗体根据划分为以下几种类型。我以WinForm窗体举例:
列表窗体:
l 编码列表窗体,公用基础编码,只有新增、修改、删除等几个按钮,功能比较简单,多使用网格控件显示批量数据。可以再加若干TextBox文本框,直接进行编辑等。例:HR模块的部门、民族等
l 单据列表窗体,整个产品中比较重要的一个窗体,用于显示业务单据,功能比较复杂,即要支持常用功能操作,例:新增、修改、删除等,也要支持个性化操作,如生成XX单据,读取XX单据,总之,功能是千差万别啊。一般使用网格控件只读方式显示数据。例:各种业务单据等
l 在以上两种窗体中,还可以加入树控件,作用是导航数据。这里的树控件,也有两种功能:显示和分类。“显示”是指网络控件中的数据在树控件里的一个映射。“分类”是指根据网络控件的某一字段值进行过滤。当然,还可以加入其他辅助性控件,来完善列表窗体的功能。
单据窗体
l 单表单据窗体,就是只有一个表的业务单据,维护起来只需要若干TextBox、ComboBox、DateTimePicker等控件。
l 两表单据窗体,我理解为具有主明细表的业务,多用于库存模块的入库单等。结构要比单表的复杂些。主表采用TextBox等控件绑定,明细表多采用网格控件,难点在于主明细表主键字段的统一、数据库保存(因为是多表,会用于事务)。
l 多表单据窗体,就是不知道有多个表,这类单据我预测以后会经常遇到。主表采用TextBox等控件绑定,各明细表即可以使用网络显示多条明细,也可以使用TextBox显示单个明细信息。总之,最为复杂。
报表窗体
l 与列表窗体十分接近,但也有所不同,在此处不过多解释。因为对于权限来说,它是比较简单的,主要包括菜单、工具栏、按钮等
还有一些其他窗体,都是具有特殊用途的,例:登录窗体,Splash窗体等,对于权限的影响不大,就不多说了。
以上窗体,无论功能如何复杂,它们都有通用的地方,比如:具有菜单、工具栏、各种控件(TextBox、DataGridView等)、状态栏。这些控件是我们设计权限的关键。另:在这些窗体的类型上,我们需要定义两个属性:(AuthorID,模块ID和WinType,窗体类型),我在后面会介绍
废话了这么多,开始讲“权限通用”的思路。我对权限的理解:就是在某个窗体(或页面)里某种操作状态(新增、修改、删除等)下,是否允许操作员对某一控件或数据进行操作。可能有些抽象,其实我们设计权限,无非是管理一个人对数据的操作,操作就包括功能操作和数据操作了。
前台的窗体中,我以新增操作为例,可能会使用菜单执行新增,可能会使用工具栏新增,可能会采用按钮新增,其实这些使用不同控件的新增,我们如何通用设计呢,我是这样设计的,在后台,我对某个工作组(角色、操作员均可),在某个窗体中,执行新增操作时,赋一个值就可以了。例:对操作员A在窗体B中的新增操作C设置是否可见,是否允许。这条规则(UserA,frmCityList,Add,IsVisible=1,IsEanbled=1),我们在后台存放进一个表里就好了,在前台直接调用下就好了。
可能有人会问:我前台使用的是菜单,我使用的是工具栏里的按钮。如何产生关系呢?其实这样设计就可以,前台的控件,我想大部分公司或个人,都会自己重载一个,而不会从工具箱里直接拖一个使用,怎么说也有个祖先吧。在这些祖先里面,我定义了一个属性AuthName(权限名称),在刚才那条规则的表中,再定义两个字段,用于表是是何种控件和控件名称就行了。然后在前台调用的时候,我们对相关的控件的这AuthName属性赋值就可以了。
有人觉得这种规则设置起来比较麻烦,我又不知道有哪些窗体,这就用到了我在前面的窗体属性AuthorID和WinType,其实我设计这两个字段,就是为所有规则进行定位。例:库存模块的入库单,我可以定义其AuthorID=”SGB01”,列表窗体的WinType=”list”,单据窗体的WinType=”bill”。在定义这类规则时,加上这两个字段就可以了。
还有,这条规则可能是工作组的权限,也可能是角色的,也可能是用户的。我们再加上这个字段就可以了。即:权限类别(AuthLevel)。
通过加上这几个字段,似乎功能权限的方面就设计得差不多了。其实我们还可以再分门别类的划分下,在数据库里多保存几张表,以减轻对数据库的压力。例:工作组列表窗体权限表、工作组单据权限表、角色列表窗体权限表等。然后可以使用视图来统一起来,不统一也可以,直接用也可。
在前台如何调用这些呢?如果你的控件是动态生成的,那么是动态生成的,直接对AuthName属性赋值即可,同时对这个控件进行权限设置即可。
u 数据权限
数据有什么权限呢?我的理解就是某些人在某些单据中,由于某种原因无法看到某些数据或看到部分数据。
根据上面的思路,我们继续设计,比如最一开始的那个例子,销售部经理a要看到部门A和B两个部门的数据,销售部经理b只允许看到部门B的数据。假设我们不设置数据权限,可能a和b都能看到A和B的数据,没有限制。我对经理b设置了一条数据权限规则,即:对客户数据.部门=’部门B’,然后在经理b加载调用这条数据即可,我给它起了个名字:限制域。(哈哈,可能有看到的朋友要拍砖了,这是盗用我们公司的名词,嘿嘿,我在此只是借用了下,仅此而已,比较形象咯)。简单说,我们可以对任何工作组、角色或操作员、任何窗体设置数据权限,前提是我们需要知道窗体中显示的数据字段信息,不然我们找不到关联关系!将这条信息拼接到加载数据的SqlSelect语法里就可以了,若是列表窗体,建议增加一个窗体属性,因为我们会随时调用它的,比如:用户查询数据时。
2.2.2界面设计
在前台我们需要定义如下方法
l 设置控件权限
wf_set_controlauth:遍历adSetControlAuth表,根据AuthorID和WinType找到当前模块ID当前窗体的权限设置,绑定所在的控件,设置控件的AuthName属性,即AuthName=’add’即可。遍历控件,然后在权限表中find一下,如果有权限设置就直接设置即可。如下所示
wf_set_toolbar:只设置工具栏的按钮权限
wf_set_control:只设置TextBox、ComboBox等控件的权限
wf_set_datagrid:只设置DataGridView控件的权限
wf_set_statusbar:只设置StatusBar控件的权限
另外,还有一些额外权限,就是窗体中的某些字段值发生变化时,可能会影响到其他控件的权限设置,例:可能会显示,可能会隐藏。这个问题,我会在另一篇贴子中再详细描述。
2.2.3类图设计
2.2.4程序流程
功能权限

更正下:数据不存在应该直接指向:结束。由于vioso不在公司,先在此注明下。
数据权限

2.2.7数据结构
u 功能权限
作用: 1,区分权限类别,目前只有两条数据:功能权限和数据权限
2,扩展使用,预留
说明: 1,新增人、新增时间、修改人、修改时间是我参考博客园的贴子,加上去的。不是原创
2,使用bit字段类型,相当于前台的bool型
作用: 1,区分权限级别,目前包括工作组权限、角色权限和用户权限
2,扩展使用,预留
作用: 1,权限的名称,这个表是我最近才加进来的,对以后扩展大有好处。它可以定义有哪些权限,比如:新增、修改、删除等常用权限,也可以自定义设置权限名称。建议最好用名称英文简称进行区分。
作用: 1,定义工作组级别的列表窗体权限
说明: 1,权限名称与权限名称.名称英文简称字段保持一致
2,权限操作一般分为允许显示和允许可用。如果有其他操作,可以新建一表,保存起来,便于维护。
下面表的表结构与上面基本一致,不再详述
工作组单据窗体权限
工作组其他窗体权限
角色列表窗体权限
角色单据窗体权限
角色其他窗体权限
用户列表窗体权限
用户单据窗体权限
用户其他窗体权限
我们可以对上述表做一个视图,其实这些表的作用只有一个,就是当某个用户打开某个窗体,其中的某个控件是否允许显示,允许可用。
u 数据权限
说明: 1,权限级别,区分工作组、角色、用户
2,权限对象,具体对象名称
3,替换控件名称、字段名称和字段类型,主要是用于动态设置使用,因为可能主表的某一字段值过滤明细表的数据
说明:表结构晚上回去补上,现在在公司里,没有带过来。不好意思。
2.2.8注意事项
1.整个权限文档还有很多地方没有设置,比如权限如何快速复制,不同用户间的权限调配等,有时间我会慢慢描述的。
3问题讨论
欢迎大家提出自己的想法,扔砖也可以。