bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 Delphi 為應用程式加入全面的功能權限控制
查看: 2805|回復: 0
go

為應用程式加入全面的功能權限控制 [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2006-6-23 13:53 |只看該作者 |倒序瀏覽 |打印
于洪

  在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,由其在开发数据库方面的应用,这项功能更为重要。但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?笔者在软件开发过程中,曾被此问题困挠过。大家知道,现在的应用,一般均以菜单访问功能的形式出现,按照常规的做法,只要让注册进入应用的不同用户,可以访问不同的功能菜单,从而实现功能权限的控制,但是,有这样一个问题,此种方法便无能为力,现在的应用软件,为了提高软件的易操作性,同一功能可能有多种不同的访问方式,如工具条,右键菜单等;同样,同一个功能,也可能在软件的不同地方被调用,而不仅仅被限制为用程序的主菜单来调用,这样,才能保证应用的易用性。写到这,问题已经非常清楚,对于要限制的软件功能,仅通过一次代码设计,无论在整个应用的任何地方或通过何种形式调用此功能,都能被功能权限所限制。

  最近,笔者利用Delphi平台作应用开发时,通过Delphi4提供的VCL控件解决了这一问题。在了解如何实现功能权限控制之前,得先看一下Delphi4提供的新控件TActionList,通过TActionList,应用程序可以统一管理其TAction,这里的Action,可以理解为应用程序的功能。在应用的设计期间,可以通过TActionList编辑器将功能(Action)加入TActionList,将Action加入TActionList后,就可能通过Object Inspector设置Action的属性或为其建立事件句柄。在这里,我们可以用Action的OnExecute事件句柄实现具体的功能,如下代码来显示一个操作窗体:

procedure TfrmMain.SetUserExecute(Sender: TObject);
begin
 frmUser.showModal;
end;

  当要限定这一功能时,可能利用TAction的Enabled,将其设为False,此功能对于用户将被屏蔽掉,如果要此功能对用户不可见,则可以设定Visible为False。

  当成功能的建立了TActionList后,可能有人问,如果使用其中的Action,其实,在Delphi4中,象TButton、TMenuItem、TSpeedButton、TRadioButton等控件,均有一个属性Action,正是通过它,我们可以将Menu或Button连接到TActionList中TAction,从而实现功能按钮或菜单的功能。

在理解了Delphi中的TActionList及TAction之后,就可以看看功能权限的具体实现方法。

第一步,建立两张表,一张表存储用户信息,另一张表存储权限定义。

用户信息表User结构如下:

字段名称
类型
字段说明

UserID
String
用户的ID号,为表关键字

UserName
String
用户名称

UserPassWord
String
用户口令


UserRight表结构如下:

字段名称
类型
字段说明

UserID
String
用户的ID号,为表关键字

ActionCaption
String
存储功能的名称,即Action的Caption属性值

ActionEnable
Boolean
存储功能是否可以访问,即Action的Enable 属性值

ActionVisible
Boolean
存储功能是否可见,即Action的visible属性值


第二步,增加用户时填加用户功能权限

当向User表中增加用户时,需要向UserRight中增加功能设置记录,先看看下面的实现代码:
  1. procedure TfrmUser.N1Click(Sender: TObject);
  2. var
  3.   i:Integer;
  4.   Action:TAction;
  5. begin

  6. //Add Action into user right cds.
  7.   with frmMain do
  8.   begin

  9.     for i:=0 to ActionList1.actioncount-1 do
  10.     begin

  11.       Action:=ActionList1.Actions[i];
  12.       cdsUserRight.AppendRecord([cdsUser.FieldByName(’userName’).AsString,TAction(Action).Caption,TAction(Action).Enabled,i]);
  13.     end;
  14.   end;
  15. end;
複製代碼


  在这段代码中,用到了TActionList的两个属性,一个是ActionCount,另一个是Actions。ActionCount表示TactionList中有多少功能,即Action,Actions是一个数组属性,通过索引可能访问每一个TAction,从而可以设置其具体的属性,象上面提到的Enable及Visible,从而达到限制的目的,通过这段代码,将应用程序的所有功能都加入了UserRight表中。

第三步,可以用Grid对上一步产生的表进行编辑操作
第四步,利用第二、三步产生的功能限制表UserRight,限制用户的权限,这可以在应用程序的主窗体的OnCreate 中实现。
  1. procedure TfrmMain.FormCreate(Sender: TObject);
  2. const
  3.   testUser=’yh’;
  4.    
  5. var
  6.    cdsRight:TClientDataSet;
  7.    i:Integer;
  8. begin
  9.   //set right of function
  10.  cdsRight:=TClientDataSet.Create(self);
  11.  try
  12.    cdsRight.LoadFromFile(’Right.CDS’);
  13.    cdsRight.AddIndex(’id’,’UserName;ActionCaption’,[],’’,’’,0);
  14.    cdsRight.IndexName:=’id’;

  15.     for i:=0 to ActionList1.ActionCount-1 do
  16.     begin
  17.      if cdsRight.FindKey([TestUser,TAction(ActionList1.Actions[i]).Caption]) then
  18.        TAction(ActionList1.Actions[i]).Enabled:=cdsRight.FieldByName(’ActionEnable’).AsBoolean;
  19.    end;
  20.  finally
  21.    cdsRight.Close;
  22.    cdsRight.Free;
  23.   end;
  24. end;
複製代碼


  这段代码中,假设当前的用户ID为yh,同时只设定了功能的Enable属性。

  最后,笔者为了演示功能权限的设定功能,制作了demo程序,感兴趣者可以向作者索取。在demo程序中,同时还使用了内存表ClientDataSet的使用方法,不用BDE建立瘦数据库应用程序。
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-4-30 16:48 , Processed in 0.013619 second(s), 10 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.