权限控制(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

权限控制(delphi actionlist)的更多相关文章

  1. delphi 权限控制(delphi TActionList方案)

    在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,由其在开发数据库方面的应用,这项功能更为重要.但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?大家知道 ...

  2. YII2中使用RBAC对模块,控制器,方法的权限控制以及规则的使用

    在使用YII2中自带的RBAC时,需要先配置config/web.php: return [ // ... 'components' => [ 'authManager' => [ 'cl ...

  3. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  4. MongoDB 安全和访问权限控制

    MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录 一,访问控制的参数 1,绑定IP地址 mongod 参数:-- ...

  5. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

  6. ASP.NET MVC实现权限控制

    这篇分享一下 ASP.NET MVC权限控制.也就是说某一用户登录之后,某一个用户是否有权限访问Controller,Action(操作),视图等 想实现这些功能,需要在数据库创建好几个表:[User ...

  7. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

    项目结构:   1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  8. Appfuse:权限控制

    Appfuse的权限控制依赖于Struts的Menu机制,common下的menu.jsp是对菜单顺序的定义,详细的菜单项和菜单链接及权限再menu-config.xml中控制,如下: <Men ...

  9. .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

    项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢 ...

随机推荐

  1. 集合篇-----ArrayList与LinkedList之间的那些小事

    各自特性: ArrayList  : 是一由连续的内存块组成的数组,范围大小可变的,当不够时增加为原来1.5倍大小,数组. :调用trimToSize方法,使得存储区域的大小调整为当前元素数量所需要的 ...

  2. PHP把数组按指定的个数分隔

    PHP把数组按指定的个数分隔 假设数组为array(‘1’,‘2’,‘3’,‘4’,‘5’,‘6’); 想把它分割成四个,那么结果为array(‘0’ => [‘1’,‘2’],‘1’ => ...

  3. 百度人脸识别java html5

    1.前端thymeleaf+h5 index.html    人脸识别+定位,用的百度sdk <!DOCTYPE html> <html xmlns="http://www ...

  4. java中list和map的底层实现原理

    Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程安全,效率 ...

  5. poj1236 Network of Schools(SCC缩点+结论推导)

    第一问简单不讲. 第二问简化后问题是给一张DAG求最少添加几条边使得DAG变成一个SCC.首先所有中间点(有入度有出度)肯定直接顺着走到无出度点,所以肯定是无出度点连向无入度点. 把无入度点作为点集S ...

  6. mongodb命令---创建数据库,插入文档,更新文档记录

    创建数据库----基本就是使用隐式创建 例如 use 你定义的数据库名, use dingsmongo  如果你使用的是studio 3T软件,那直接选中右侧的地址栏点击右键选择Add Databas ...

  7. axios请求提交的form data格式 明明是JSON格式的参数却转成了字符串格式

    问题:传的参数成为了字符数格式 解决:把参数的格式转换 const params = new URLSearchParams() params.append('USER_LOGIN', 'admin' ...

  8. openstack使用

    管理员登陆: 身份管理--->创建项目 身份管理--->创建用户(角色:_member_)(管理指定项目) 管理员--->云主机类型--->创建云主机 管理员--->镜像 ...

  9. awk_printf

    awk -F: 'BEGIN{printf "%-20s%-20s%-20s\n","User","UID","Home" ...

  10. Verilog求余

    在实现三角函数时,考虑到函数的周期性,综量(自变量)需对周期做求余运算. 假设函数周期为T = 2^N,那么求余运算就是直接取该数的低N位,即: 以M位正数为例(符号位为0),reg [M-1:0] ...