权限控制大终结!(有爱心的看吧,如果要分数去其他的帖子!)(0分)

  • 主题发起人 主题发起人 freesoft
  • 开始时间 开始时间
F

freesoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我一直为好的权限控制所困惑。
当然包括控制和授权两方面。
看到一些国外的程序员编写的权限空程序,真的是太漂亮了。可是。。。
其实每个差不多每个程序都要用到权限控制,为什么大家不静下心来讨论,分析一下!
使我们的程序变的更完美呢?
下面是我的权限控制程序代码,希望抛砖引玉。procedure Tdrf.BitBtn1Click(Sender: TObject);
var Con:String;
begin
fileName:=ExtractFilePath(ParamStr(0))+'ConS.ini';
if FileExists(FileName) then
begin
SL:=TStringList.Create;
SL.LoadFromFile(FileName);
Con:=SL.Text;
try
dataf.qb.Connected:=false;
dataf.qb.ConnectionString:=Con;
dataf.qb.Connected:=true;
except
begin
showmessage('数据库初始化错误,无法找到数据库'+#13+Con);
SL.Text:=PromptDataSource(Application.Handle,dataf.qb.ConnectionString);
IntINI;
end;
end;
end;
if (drf.Edit1.text='') or (drf.edit2.text='') then
showmessage('请输入完整信息')
else
begin
with dataf.adoquery1 do
begin
close;
sql.clear;
sql.add('select * from uerall where pass='+''''+edit2.text+'''');
sql.add('and id='+''''+edit1.text+'''');
open;
if dataf.adoquery1.RecordCount<>1 then
begin
//APPLICATION.messagebox('该用户不存在,请联系管理员','错误',MB_ICONINFORMATION+MB_OK)
drf.modalresult:=0;
end
else
begin
n:=dataf.adoquery1.fields[0].asstring;
m:=dataf.adoquery1.fields[1].asstring;
drf.modalresult:=1;
end;
end;
end;
end;

//以上是登陆窗口的确定。
以下是主窗口的formcreat
procedure Tmain.FormCreate(Sender: TObject);
var j:integer;
temp:boolean;
Con:String;
begin
fileName:=ExtractFilePath(ParamStr(0))+'ConS.ini';
if FileExists(FileName) then
begin
SL:=TStringList.Create;
SL.LoadFromFile(FileName);
Con:=SL.Text;
try
dataf.qb.Connected:=false;
dataf.qb.ConnectionString:=Con;
dataf.qb.Connected:=true;
except
showmessage('数据库初始化错误,无法找到数据库'+#13+Con);
end;
end;





//main.StatusBar1.panels[0].text:='时间: '+datetimetostr(date);
main.StatusBar1.Panels[1].text:='操作员:';
main.StatusBar1.Panels[2].text:=n;
with dataf.ADOQuery2 do
begin
close;
sql.clear;
sql.add('select * from rig where id='+''''+n+'''');
//sql.add('and actioncap='+''''+taction(actionlist1.Actions[j]).caption+'''');
open;
for j:=0 to actionlist1.ActionCount-1 do

if dataf.ADOQuery2.LOCATE('actioncap',TAction(actionlist1.Actions[j]).caption,[loPartialKey]) then
taction(actionlist1.Actions[j]).enabled:=true
else
taction(actionlist1.Actions[j]).enabled:=false;
end;

 
这只是控制到菜单的方式
未免太简单了
 
lingxin兄:给我们一个比较复杂的demo,谢谢。
 
我查过很多资料,不过详细的好象没有几个,不知道现在的人是保守还是其他的原因。
希望更多的人能够把自己的东西拿出来让大家分享一下,这不也是一种快乐吗?
 
要控制到怎样详细的程度?
我们做的软件控制到修改、新增、打印、成本显示等的权限,够不够?
 
TO: SOFTDOG;
当然,贴出来看看!让以后的人再也不要为了控制去烦恼了,你多伟大啊!
 
详细代码涉及公司机密不能贴出来。
大致思路是这样:
在一个权限表中写入某个用户对某些模块的操作权限(读、改、删等),然后在具体的模块
中执行某个动作的时候检验就行了。
 
基本思路和SOFTDOG一致
建立权限表,详细划分用户多不同模块,不同控件的操作权限
比如用户A,可以进行删除操作,该窗体的删除按钮(BOTTON1)权限就分配给A用户,在权限表中,加入A用户
可以操作BOTTON1
在窗体的BOTTON1的CLICK按钮中,首先读取属于该按钮的权限记录,判断当前用户是否有权限进行操作
就可以进行控件级的权限控制。
 
TO:all
没有人肯告诉具体的做法吗,真的可悲,这也许就是中国的软件业——保守!!!!!!!!
 
用enabled来控制权限是很幼稚的,因为可以程序很容易的破解开。甚至我还见过专门的软件。
要想达到真正的控制,必须在操作执行的时候进行校验。
我就是保守,就不告诉你!
 
SQL SERVER直接支持用户控制和角色管理。
何必舍近求远?
 
甚至我还见过专门的软件
~~~~~~~~~~~~~~~~~~~~~~ 告诉我哪里下载的?总不至于这个也保守吧。。:)
 
其实现在大家做的一般就是以下两种:
一、能过菜单或者树形控件的visible来控制,开始将菜单或者树的节点可见可不见援于用户,
登录后,检测权限字段,如果有则visible为true,反之则为false;
二、将软件有的权限放在一个表中,即一个权限就是一个字段,在用户使用时,检测这个字段的
值为true则可以使用反之则不能使用(这种方法最简单,但权限太多时就变得复杂了);
上面的代码如果关心的我可以放出来。
三、而我写的程序都未使用以上两种方法:
首先可以定义每个窗体操作的权限名称(即打开窗体,新增、修改、删除、打印的权限名称),
在援权时支持用户受权,用户分组受权、权限分组。这个实现起来很复杂,但写好了之后,
只是调用就简但了。
这种代码就复杂了,并且又与数据库有关,只能提供思路。
受权,应该说实现了权限控制所有功能。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=958559
 
继续~~
 
to zcm1975117
你的方法基本不可行。不便于维护修改
我来说一下方法吧。
权限表里只有三个字段(权限类别,权限名称,权限ID),
相关权限只是作为记录添加
在操作员表中有个权限字段,用来存放权限ID
 
谁若能只用一个表,三个字段实现一个象样的权限管理,真是令人佩服。
不是俺吹牛,仔细看看http://www.delphibbs.com/delphibbs/dispq.asp?lid=958559中的
数据库结构,对你做权限管理还是会有不少帮助的。
 
这个问题在mis杂志上曾经有一些系统的集成中提到过;
比如:
user table:
user password power
a *** 1
b *** 4
menu table:
menuname power
edit 1
setting 9
and so on.......
这样不是可以控制到菜单吗?而且可以继续细化,设置更细致一些。
@_@
 
后退
顶部