pb中多用户权限管理实现方案
(南京审计学院教育技术中心 210029 丁国勇)
在pb实现一般管理系统的时候,我们会遇到这样一种情况,作为一个系统,可以分为若干个子系统,有多个操作员对它进行操作,每个操作员对各个子系统的权限不同,甚至在同一子系统中,操作员对各个菜单项的
操作权限也不一样,更细一点,不同的操作员对于同一窗口中某一按钮的操作权限也是不一样的,那么,怎样
较好地实现对不同用户细化到某个按钮的权限控制呢?笔者在进行一个系统的开发过程当中,积累了一些心得,与大家探讨一下。
首先,怎样使得一个操作员不能对他不具权限的菜单项或按钮进行操作呢,我们当然没有必要为不同的用户制作不同的菜单项或窗口(当然这也不失为一种方法),考虑到菜单项和按钮的visible和enabled属性,我们自然想到,设置这两个属性便可以完成上面的要求,比如
m_1.m_2.visible=false
或者
cb_1.enabled=false
菜单不可见了,操作员自然就不可操作了。
其次,对于一个多用户的系统,我们自然需要用一个表来存放基本的用户信息,其中要包括用户登录系统的
用户名、密码,如果要进行权限的分级控制,还需要一些字段来存放有关权限的信息,有些成品系统中是这样做的,不过它们将每个需要进行控制的菜单项均用一个字段来表示,这样做不太好,万一设计一个权限控制比较细的系统时,这样做的可行性便不好,其实,对与某个菜单项或其他控件,进行权限控制时,状态只有两个,true or false,完全可以用一位二进制数0或1来表示,我们可以将一个子系统中所有需要进行权限控制的项
组合成一个二进制串,每四个二进制数转化成一个字符(可以是"0","1","2"...."a","b","c","d","e","f"),再保存在表中,这样我们来算一下,如果一个子系统中有64个项需要进行权限控制,则只需要一个 64/4=16 位
的字符类型的字段即可以表示,而不像过去那样需要64个字段来分别标记。
好了,第一步存放的问题解决了,那么怎样根据这样的一个标记权限的字符串来设置各个菜单项或其他控件的
visible 或enabled属性呢?我注意到,pb中菜单项和其它控件都有一个tag属性,而这个属性我们一般不太会用到它,我们可以用tag属性来存放一个数字,这个数字标示了该控件在权限控制字段的那个二进制串中表示该控件的访问权限的0/1的位置,举个例子,有一个权限控制二进制串'01001111010....',菜单项"打开文件"的tag为7,则在该二进制串中第7位"1"便标记了当前用户对"打开文件"的控制权限为"1".
当一个用户登录系统时,在通过了密码验证后,将他对该系统的权限控制字段的字符串读到一个全局变量中,将该字符串恢复为0、1串,对于每个需要进行权限控制的项,依次根据其tag记录的相应位置的0或1设置visible或enabled属性,便可以完成对权限的管理。
当然,要注意的是,有些控件的权限设置并不是在一进入系统后就进行的,而是推迟到该控件被调用时才进行。
下面给出了一个例子,来说明上面的论述。
有以下3个菜单项和2个按钮需要控制
3个菜单项名称分别为:
m_a.m_h1.m_m1
m_a.m_h1.m_m2
m_a.m_h1.m_m3
以上3个菜单项的tag设置为 1-3
2个按钮位于两个窗口中
cb_1 位于w_1中
cb_2 位于w_2中
以上2个按钮的tag设置为4,5
这样,需要5位来表示他们的访问权限。
函数getbin用来进行从"0","1"...,"a"..."f"到四位二进制串的转换
getbin(string s_ch) returns string
string s_out,s_temp
integer i_len
integer i
string temp
i_len=len(s_ch)
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器