zoukankan      html  css  js  c++  java
  • 权限控制(delphi actionlist)

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

    笔者利用Delphi平台作应用开发时,通过Delphi7提供的VCL控件解决了这一问题。
    在了解如何实现功能权限控制之前,得先看一下Delphi7提供的新控件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,
    在Delphi7中,象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中增加功能设置记录,先看看下面的实现代码:

    procedure TfrmUser.N1Click(Sender: TObject);

    var

       i:Integer;

       Action:TAction;

    begin

    //Add Action into user right cds.

       with frmMain do begin

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

           Action:=ActionList1.Actions[i];

          cdsUserRight.AppendRecord([cdsUser.FieldByName(’userName’).AsString,TAction(Action).Caption,TAction(Action).Enabled,i]);

        end;

      end;

    end;

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

    第三步,可以用Grid对上一步产生的表进行编辑操作

    第四步,利用第二、三步产生的功能限制表UserRight,限制用户的权限,
    这可以在应用程序的主窗体的OnCreate 中实现。

    procedure TfrmMain.FormCreate(Sender: TObject);

    const

       testUser=’yh’;

    var

       cdsRight:TClientDataSet;

       i:Integer;

    begin

      //set right of function

       cdsRight:=TClientDataSet.Create(self);

       try

       cdsRight.LoadFromFile(’Right.CDS’);

       cdsRight.AddIndex(’id’,’UserName;ActionCaption’,[],’’,’’,0);

       cdsRight.IndexName:=’id’;

      for i:=0 to ActionList1.ActionCount-1 do begin

         if cdsRight.FindKey([TestUser,TAction(ActionList1.Actions[i]).Caption]) then

         TAction(ActionList1.Actions[i]).Enabled:=cdsRight.FieldByName(’ActionEnable’).AsBoolean;

       end;

       finally

         cdsRight.Close;

         cdsRight.Free;

      end;

    end;

    这段代码中,假设当前的用户ID为yh,同时只设定了功能的Enable属性
    ---------------------
    版权声明:本文为CSDN博主「姚军权」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/chinayaosir/article/details/4707217

  • 相关阅读:
    InnoDB存储引擎介绍-(2)redo和undo学习
    InnoDB存储引擎介绍-(1)InnoDB存储引擎结构
    MySQL共享表空间概念
    MySQL压力测试(1)-mysqlslap
    MySQL5.6复制技术(4)-MySQL主从复制过滤参数
    MySQL5.6复制技术(3)-MySQL主从复制线程状态转变
    MySQL5.6复制技术(2)-主从部署以及半同步配置详细过程
    vue 子组件 $emit方法 调用父组件方法
    es聚合后排序
    java比较两个小数的大小
  • 原文地址:https://www.cnblogs.com/jijm123/p/11305403.html
Copyright © 2011-2022 走看看