千分求权限设计方面的问题及经验,欢迎大家讨论!!!(300分)

真的有千分?
給100分先,我給你發點資料過去!
 
当然,先给300,其余的,我会陆续放出来的!
其实,设计我已大部分做出,正在代码设计中!当怕有未考虑或考虑不周的地方,
因此,想了解一下大家在做这部分时遇到的问题,也想学习一下大侠们的经验!
 
有什么资料,就贴在这里让大家讨论一下,分会发的!
 
授权总体由三部分组成:数据库、服务端和客户端。数据库保存授权的所有数据及进行相关数据更新业务(触发器/存储过程),服务端对数据库进行操作,集成所有的功能业务,客户端调用服务器接口完成用户界面功能操作,客户端不直接访问数据库。
服务器端内部功能分为两部分实现:通用授权层和授权业务层。通用授权提供基本的授权操作接口和数据操作接口,授权业务层调用通用授权接口,完成授权业务,以接口的方式提供给客户端调用。
 
***菜单权限控制:源码奉送*** V1.0请参见:
http://expert.csdn.net/Expert/topic/917/917914.xml?temp=.2989771
代码版本现已升级 V2.0,公布源代码
--------------------------------------------------------------------------
*****菜单权限分配源码奉送V2.0*****
针对以前版本功能有所扩展,增加了模块单元的操作控制
//使用ActionMainMenuBar、ActionManager、ActionToolBar效果更佳
//也可以MainMenu、ToolBar、ActionList的组合
数据库表:
CREATE TABLE [操作员] (
[操作员ID] [varchar] (15) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[姓名] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[口令] [varchar] (15) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[级别] [tinyint] NOT NULL CONSTRAINT [DF_操作员_级别] DEFAULT (2),
[部门ID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[标志] [bit] NOT NULL CONSTRAINT [DF_操作员_标志] DEFAULT (0),
CONSTRAINT [PK_操作员] PRIMARY KEY CLUSTERED
(
[操作员ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [操作员权限] (
[操作员ID] [char] (15) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[功能ID] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Visible] [bit] NOT NULL CONSTRAINT [DF_操作员权限_Visible] DEFAULT (0),
[Enabled] [bit] NOT NULL CONSTRAINT [DF_操作员权限_Enabled] DEFAULT (0),
[权限组ID] [char] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[操作标识] [char] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_操作员权限] PRIMARY KEY CLUSTERED
(
[操作员ID],
[功能ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [权限组] (
[权限组ID] [char] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[权限组名称] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[标志] [tinyint] NOT NULL CONSTRAINT [DF_权限组_标志] DEFAULT (0),
CONSTRAINT [PK_权限组] PRIMARY KEY CLUSTERED
(
[权限组ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [权限组功能分配] (
[权限组ID] [char] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[功能ID] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[操作标识] [char] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_权限组功能分配] PRIMARY KEY CLUSTERED
(
[权限组ID],
[功能ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [系统功能] (
[功能ID] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[菜单名] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[说明] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[分类] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[操作标识] [char] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_系统功能] PRIMARY KEY CLUSTERED
(
[功能ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
--“分类”字段的类型改为varchar(50)//原版本为bit
--增加了“操作标识”字段:由6位数字组成,
约定:第一位:无意义,以1表示,
第二位:增加,以1或0表示,
第三位:修改,以1或0表示,
第四位:删除,以1或0表示,
第五位:查询,以1或0表示,
第六位:打印,以1或0表示
操作标识有两层含义:1、系统功能的“操作标识”,2、操作员的的“操作标识”
操作员的的“操作标识”,例如:字符串‘110010’表示可以增加和查询,不能修改、删除和打印
系统功能的“操作标识”:必须在设计期间定义Action的操作标识,表示有没有该项功能
例如:字符串‘100011’表示该模块有查询、打印功能,没有增加、修改、删除

有效利用Action的各项属性:
Name: 功能ID
Caption:菜单名
Hint:说明
Category:分类
Tag:操作标识

定义全局变量:
var
ActName,OperaID:TStringList;
//功能ID列表,操作标识列表。变量创建过程,这里省略
CurrentOperaID:String;
//当前操作标识

//权限分配方法
procedure TMainFrm.AssignLimit;
var
i, j, k, TlbLen: integer;
Ks, Ms: Boolean;
begin

for i := 0 to ActionList1.ActionCount - 1do
//所有功能不可用
begin
TAction(ActionList1.Actions).Visible := False;
TAction(ActionList1.Actions).Enabled := False;
end;

ActName.Clear;
//清除功能ID列表
OperaID.Clear;
//清除操作标识列表
for i := 0 to ActionList1.ActionCount - 1do
//分配权限
begin
if LoginFrm.CDSLimit.Locate('功能ID', TAction(ActionList1.Actions).Name, [loPartialKey]) then
begin
TAction(ActionList1.Actions).Enabled := LoginFrm.CDSLimit.FieldByName('Enabled').AsBoolean;
TAction(ActionList1.Actions).Visible := LoginFrm.CDSLimit.FieldByName('Visible').AsBoolean;

ActName.Add(TAction(ActionList1.Actions).Name);//加入功能ID
OperaID.Add(LoginFrm.CDSLimit.FieldByName('操作标识').AsString);//加入操作标识
end;
end;

//----------------------------菜单效果------------------------------------------
if LoginFrm.Grade = '0' then
//超级管理员固定权限
begin
mmMenuInit.Visible := True;
//功能初始化
mmPopGroup.Visible := True;
//权限组功能分配
ActOperAssign.Visible := True;
//操作员权限分配
ActOperAssign.Enabled := True;
ActSysLogQry.Visible := True;
//操作员权限分配
ActSysLogQry.Enabled := True;
end else
begin
mmMenuInit.Visible := false;
mmPopGroup.Visible := false;
end;

Ks := False;
Ms := False;
for I := 0 to MainMenu.Items.Count - 1do
//一级菜单
begin
for J := 0 to MainMenu.items.count - 1do
//二级菜单
begin
if MainMenu.items.Items[J].Count > 0 then
//若存在三级菜单
begin
for K := 0 to MainMenu.items.Items[J].Count - 1do
//三级菜单
begin
if (MainMenu.items.Items[J].Items[K].Visible) and
(MainMenu.items.Items[J].Items[K].Caption <> '-') then
begin
Ks := True;
Break;
//在三级菜单中若存在Visible为True则跳出循环
end;
end;
MainMenu.items.Items[J].Visible := Ks;
if Ks then
Ms := True;
Ks := False;
end else
if (MainMenu.items.Items[J].Visible) and
(MainMenu.items.Items[J].Caption <> '-') then
begin
Ms := True;
//在二级菜单中若存在Visible为True则主菜单可见
end;
end;
MainMenu.items.Visible := Ms;
Ms := False;
end;

//-------------------------------快捷菜单效果-----------------------------------
TlbLen := 0;
j:=0;
k:=0;
for i := 0 to ToolBar1.ButtonCount - 1do
begin
if ToolBar1.Buttons.Visible then
begin
if (j=0)and(ToolBar1.Buttons.Style=tbsSeparator) then
ToolBar1.Buttons.Visible:=false //屏蔽分割快捷按钮
else
begin
if ToolBar1.Buttons.Style=tbsSeparator then
inc(k);
if k=2 then
//如果连续排列两个分割快捷按钮
begin
ToolBar1.Buttons.Visible:=false;
//屏蔽分割快捷按钮
k:=1;
end else
begin
TlbLen:=TlbLen+ToolBar1.Buttons.Width;
inc(j);
end;
end;
end;
end;
CoolBar1.Bands[0].Width := TlbLen + 15;//15这个值是个校正值,可能不适合你
//
end;

在每个Action的执行代码中,额外加入以下代码
procedure TMainFrm.ActWareBuyPlanExecute(Sender: TObject);
begin
CurrentOperaID:=OperaID[ActName.IndexOf(TAction(Sender).Name)];//取得当前操作员当前模块的操作标识
....
end;

全局函数:
//解析操作标识
function ParseOperaID(const AoperaID:string;index:integer):Boolean;
var
TmpPos:integer;
begin
TmpPos:=Index+1;
if Index<1 then
TmpPos:=2;
//把Index固定在1..5之间
if Index>5 then
TmpPos:=6;
Result:=Copy(AoperaID,TmpPos,1)=1;
end;

使用方法例如:
BtnAdd.Enable:=ParseOperaID(CurrentOperaID,1);//增加
BtnModi.Enable:=ParseOperaID(CurrentOperaID,2);//修改
BtnDel.Enable:=ParseOperaID(CurrentOperaID,3);//删除
建议使用按钮的Tag属性
-------------------------------------------------------------------------------------------------
与之相关的功能列表:
1、系统功能初始化:
2、权限组功能分配:
3、操作员功能分配:
限于篇幅,源代码不再贴出,都是简单的数据库操作。
注意一点:
操作标识的显示问题,//总不能把‘100110’显示出来吧

最后一段代码:
在数据集字段的OnGetText事件中:
var
Str:string;
begin
if ParseO
]]>
 
欢迎大家提出三层权限方面的意见和想法!!!
 
TO jefrin:
这种设计不是很方便扩展!
 

参考一下Win2000中的权限设计(用户与组)。
 
已前搜索过论坛关于权限方面的问题和设计,
现在的设计已能解决大部分复杂的问题!
希望大家能提些你们在做权限时没有解决的或比较辣手的问题!不知道这个要求合不合理!
 
你能不能把问题说得更加具体一点!!!!
 
我自己设计用户组、用户、权限、用户参数共四个数据表,模拟Win2000中
的权限设计(用户与组)。
编程思路:将需要执行及控制权限的事件全部放到Action中,然后
通过编程来控制ActionExecute的Visible和Enable,至于菜单事件,
都是虚的,只要将它与ActionExecute连接起来即可。
本人E-MAIL:chnplzh@163.com
 
我设计的表有:
用户(组)表,用户关系表,操作集合表,资源操作表,资源类表,资源表,权力表,用户权限表。
用户(组)可以继承组的权限,用户(组)对某资源类的某种操作具有的权力可以延继到资源类的所有实例。
每个用户都可以将自己拥有的权限授予给别的用户(组)
 
唉,都差不多的啦!我来了!
 
可以用組,每組有什麼權限,總之和操作系統(2000,NT)一樣就行。。[:D]
 
我写的权限分配有两种方式:
1.权限-->人员
2.权限-->角色-->人员
其中角色就相当于楼上说的“组”
 
权限通常可以设计成:
模块(元素):包括界面上所有需要控制的按钮、菜单、窗口等;
权限:针对模块当中需要控制的内容,形成一定的记录;
权限组:权限的集合。
角色:根据实际情况预先定义,比如说**查询,**审批等,它是模权限组的集合;
用户:所有的操作用户,它从属于某一个角色;
重点是要注意数据之间关联性问题,比如说进行数据的增、删、改操作之后的相关处理,另外就是日志的处理,如果客户端数目较多的话,日志处理是一个相当麻烦的事情。
 
权限这玩意儿没什么讨论的,当然也是必须要讨论的。
多层结构看你怎么分布用户层、服务层及数据库?
你的权限要求有哪些?
jifrin的帖子我感觉通用性还不错,那你说的扩展是哪些内容?
你指的是各个表结构的扩展吗?
我最怕讨论,说了一大堆不知道有没有人听,那你就再具体一些吧,1000分是很诱惑的哦。
 
还有一种是不光是根据菜单的,
如A保存的这条记录,不可让B,C看到,
但可以让E和经理看到
怎么设计呢
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
933
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部