1. 引言
随着计算机应用领域的不断扩展和计算机使用部门与人员的不断普及,使大型计算机应用系统的使用权限和系统权限管理的设计与实现成为人们关注的焦点。每一个较成熟的大型管理信息系统一定有一个权限管理系统来支撑,通过该系统严格分配进入系统的用户的使用范围与操作权限,以保证系统操作的安全性和合法性。
由于权限的分配不仅要求指定到任何一级菜单,而且要求定义到具体的窗口,甚至指定到一个窗口的某个按钮上。而不同的应用系统,对使用权限的控制要求是不同的,针对以上问题,研究权限管理的基本规律,采用面向对象的软件设计方法来实现通用权限管理系统,是本文要解决的问题。
2. 系统主要设计思想
众所周知,应用系统面向最终用户的操作界面,都是由一个个的窗口构成。因此,我们定义两个基本类,一个是业务窗口基本类:TChildForm,在这个基类里,我们实现如下的几个过程:定义基本的窗口界面:SetDisplayStyle,捕获窗口不可操作的控件:HandControlsAuthrity。那么只要继承于TchildForm类型的窗口,我们都可以控制其窗口上的所有控件。假设应用程序之间的继承关系是图一的一种方式。主窗口的继承关系为图二的一种方式。主窗口基类里必须有一个过程,即设置菜单权限。
应用系统主要包括两种形式的主要窗口,只要具体的业务窗口继承于以上两类窗口,就能够实体对窗口上的菜单、按钮、组合框等的统一控制。
我们采用数据库定义与面向对象编程方法来实现通用权限管理,重点考虑两点。
(1)建立权限管理数据库,对包括应用系统模块信息,系统功能菜单信息,系统权限定义信息、用户操作权限信息、权限角色信息等直接与系统操作类型与操作权限紧密相关的信息进行分类,并建立相应的数据基表。
(2)应用系统模块都是通过继承某一个最基本的模块来实现其操作的,我们利用面向对象编程所具有的继承特性,通过子类对象继承父类对象的属性和方法,将实现权限控制的函数和过程写在一个最基本的父类里,来实行操作权限的管理。
3.系统的设计与实现
一般来说,大型的应用系统都是由若干个相对独立的子系统组成,他们的关联是通过数据访问与交换来实现的。利用这一特点,将权限管理系统设计成一个独立的子系统。他在功能上是不依赖于其它的子系统,对应用系统的权限控制,是通过访问相关子系统的菜单,各子系统的窗口,以及窗口的控件来实现的。为了实现这些功能,权限管理系统应具有相对独立的操作界面和系统的数据库。
3.1系统数据库设计
使用数据库来记录每一角色或每一用户的权限,以实现每个不同的角色或者用户具有不同的操作权限。系统登录时采集用户号,与数据表中该用户分配的角色或者角色的权限,在业务窗口基本类TchildForm,用一个过程来设置窗口上所有定义了权限的控件的可见性与可视性。数据表的描述如下:
3.2角色目录
名称 |
别名 |
类型与长度 |
角色ID |
ROLE_ID(pk) |
Numeric(8) |
子系统ID |
SYSTEM_ID |
Numeric(8) |
角色名称 |
ROLENAME |
VARCHAR(50) |
角色类型 |
ROLETYPE |
CHAR(1) |
创建者ID |
CREATORID |
Numberic |
3.3权限目录定义
名称 |
别名 |
类型与长度 |
权限ID |
AUTH_ID(pk) |
Numeric |
子系统ID |
SYSTEM_ID |
Numeric |
窗口名称 |
FORM_NAME |
Varchar(20) |
本级的父ID |
PARENT_ID |
Numeric |
类型 |
ITEM_TYPE |
char(1) |
控制类型 |
CONTROL_TYPE |
char(1) |
权限名称 |
AUTH_NAME |
Varchar(50) |
权限别名 |
AUTH_CODE |
varchar(20) |
3.4子系统目录
名称 |
别名 |
类型与长度 |
子系统ID |
SYSTEM_ID(PK) |
Numeric |
子系统代码 |
SYSTEM_CODE |
varchar(10) |
子系统名称 |
SYSTEM_NAME |
varchar(50) |
3.5角色权限定义表
名称 |
别名 |
类型与长度 |
角色ID |
ROLE_ID(pk) |
Numeric |
权限ID |
AUTH_ID(pk) |
Numeric |
3.6用户具有角色定义
名称 |
别名 |
类型与长度 |
用户ID |
User_ID(pk) |
numeric |
角色ID |
Role_ID(pk) |
numeric |
3.7用户目录
名称 |
别名 |
类型与长度 |
用户ID |
USER_ID(PK) |
numeric |
用户编号 |
USER_NO |
varchar(10) |
口 令 |
PASSWORD |
varchar(10) |
是否为超级用户 |
ISSUPER |
char(1) |
子系统ID |
system_id |
numeric |
创建者ID |
Creatorid |
numeric |
3.8用户权限目录
名称 |
别名 |
类型与长度 |
权限ID |
AUTH_ID(pk) |
Numeric |
用户ID |
USER_ID(pk) |
Numeric |
增、减类型 |
TYPE |
char(1) |
3.9视图的建立
建立了上述基表之后,再建下列视图表,以利于系统程序的优化,提高可读性和系统性能。
3.10系统操作视图
CREATE VIEW AUTH_V_USERS_LOGIN (user_id, user_no, password, system_id, system_code) AS SELECT a.USER_ID, a.USER_NO, a.PASSWORD, b.SYSTEM_ID, b.SYSTEM_CODE FROM AUTH_USERS a, AUTH_SYSTEM b WHERE a.system_id = b.system_id
3.11系统权限视图
CREATE VIEW AUTH_V_USERSET (auth_id, system_id, auth_code, auth_name, form_name, parent_id, item_type, control_type, user_id, type) AS SELECT a.AUTH_ID, a.SYSTEM_ID, a.AUTH_CODE, a.AUTH_NAME, a.FORM_NAME, a.PARENT_ID, a.ITEM_TYPE, a.CONTROL_TYPE, b.USER_ID, b.TYPE FROM AUTH_ITEM a, AUTH_USERSET b WHERE a.auth_id = b.auth_id
3.12角色权限视图
CREATE VIEW AUTH_V_ROLESET (auth_id, system_id, auth_code, auth_name, form_name, parent_id, item_type, control_type, role_id) AS SELECT a.AUTH_ID, a.SYSTEM_ID, a.AUTH_CODE, a.AUTH_NAME, a.FORM_NAME, a.PARENT_ID, a.ITEM_TYPE, a.CONTROL_TYPE, b.ROLE_ID FROM AUTH_ITEM a, AUTH_ROLESET b WHERE a.auth_id = b.auth_id
通过数据库的建立和数据的定义,对各系统的编号、名称,每个系统具有的用户,每个用户所拥有的角色,每个角色所拥有的操作权限进行了规定。这样当用户登录到某一个具体的子系统时,该用户是否合法,它具有哪些操作权限,都可以通过权限管理系统来进行控制。
3.13系统程序设计
通过数据库的设计,我们规定了每个用户所拥有的系统功能操作权限。在得到每个用户所有的系统功能权限以后,怎样控制其具体的菜单,甚至窗口中指定的控件,是权限管理系统要解决的另一个主要问题。根据每一个子系统均存在严格的继承关系这一特性,我们使用两个基类窗口来进行编程控制。
3.14主窗口(TMainBaseForm)
对主窗口,主要考虑控制菜单的可见性或可用性。在窗口引导的同时,执行以下几个过程:
(1)ReadUserMenuAuthrity (Auth_ID,Systm_ID:string var Flist:TList):读取某一个子系统下,某一用户能够操作的菜单权限,并把权限存放在一个列表对象fList中。
(2)ReadSubSystemMenu (System_ID:string;aList:TList):读取某一个子系统所有可以操作的菜单,并把它存放在列表对象aList中。
(3)SetMenuEnableVisible (aList,Flist):根据取得的两种结果,循环比较,如果alist中的一个项在fList中找不到,则肯定此人不具有操作此菜单的权限,从而由3.1.2的控制类型控制其可用还是可见。
3.15业务窗口(TChildForm)
对业务窗口,在基类TchildForm里的引导事件中增加如下几个过程:
(1)ReadUserControlAuthority (Userid,SystemId,AformName:string;var Flist:TList):读取某一个子系统、某一用户、某一窗口名下不能够操作的控件,并把它存放到对象Flist中。这里读取的是某一用户不能操作的控件对象,这样在定义这个用户的控件权限时也只要定义他的不能操作的控件。因为大部份控件对象肯定是可以操作的,所以定义不能操作的控件比定义可操作的控件要容易得多。
(2)SetUserControlEnableVisible (UserID,SystemId,AformName :string):循环读取窗口下所有的控件对象并与Flist对象中的项比较,如果窗口对在Flist找到,说明该控件对象不可以操作或不可显示(由控制类型决定)。
结束语
通用权限管理解决了通过权限管理系统来控制大型应用系统中各子系统操作权限的问题。权限管理系统与大型应用系统是相对独立的两个系统,与传统的权限管理是子系统中的一个模块相比,它克服了系统权限定义复杂、管理控制繁琐、修改调整困难的弊端。
通用权限管理系统可以对菜单一级的权限进行控制,还可以对窗口中所有可视控件进行控制,包括按钮、文本输入框、面板、标签等。进一步对受控系统可以进行增加,删除等数据库记录级的控制操作。系统还可以根据用户需要,对受控对象提供可视(Visible)、可用(Enable)两种方式的控制。
根据本文讨论的设计思想和方法开发的通用权限管理系统,已在多个CIMS系统和ERP系统中得到成功应用。
参考文献:
1、 陈余年,方美琪.信息系统工程中的面向对象方法 北京:清华大学出版社,1999
2、 王忠华,杨志刚.Delphi5.0程序设计 北京:中国铁道出版社,2000
3、 [美] Jacquie Barker.Java 面向对象编程指南 北京:电子工业出版社,2000
4、 王如龙.中铝广西分公司CIMS系统的开发与实施(企业信息化集成) 2003.9
作者简介:
1、 周支元
1969年9月出生,大学本科毕业,讲师,主要研究方向:管理信息系统开发、数据库设计。
详细地址:
邮编:418000 湖南省怀化市锦溪南路148
怀化医专计算机教研室
2、 王如龙
1954年4月出生,大学本科毕业,研究员,主要研究方向:企业信息化工程,软件项目管理。
详细地址:湖南省高新区M7-2栋
邮编:410013