PB权限控制的完整方案



PB权限控制的完整方案

分类: 编程开发 2363人阅读 评论(0) 收藏 举报

权限控制的完整控制方案PB+sybase
此权限控制方案可以精确控制到每个窗口的按钮级别
chinayaosir
/***********************************************/
0.表格设计
//用户权限表
create table dbo.qa_authority (
userid char(20) not null,
username char(10) null,
menuid char(10) default ('xxxx') not null,
rwdp char(4) default ('xxxx') not null) ;
alter table dbo.qa_authority
add constraint qa_authority_px
primary key nonclustered (userid, menuid, rwdp) ;

//用户清单
create table dbo.qa_userlist (
office char(4) default ('') not null,
deptname char(20) default '' not null,
userid char(20) not null,
username char(12) default '' not null,
password char(8) default ('000000') not null,
onoff char(1) default ('Y')  not null) ;
alter table dbo.qa_userlist
add constraint qa_userlist_px
primary key nonclustered (userid) ;

//用户名自动更新权限的触发器过程
/*当在qa_userlist删除一个用户时,自动删除qa_authority权限记录,条件是按userid在两个表都存在*/
create trigger dbo.del_qa_userlist
on  dbo.qa_userlist           
for DELETE as       
begin           
  delete qa_authority 
  from qa_authority ,deleted           
  where (qa_authority.userid =deleted.userid)
end


/***********************************************/
1.系统菜单结构
总菜单名称 m_main
第1列菜单名称 m_a

第2列菜单名称 m_b
第3列菜单名称 m_c
...  ...
第26列菜单名称 m_z

第1列子菜单1行 m_a1
第1列子菜单2行 m_a2
第1列子菜单3行 m_a3
第1列子菜单4行 m_a4

第2列子菜单1行 m_b1
第2列子菜单2行 m_b2
/***********************************************/
2.用户权限设置窗口
2.1.在此窗口的OPEN事件生成系统的菜单
int ii
//系统菜单第1列
tab_1.tabpage_1.dw_a.settransobject(sqlca)
//Smenuname, remark, rwdp, s_menu
//1
ii=tab_1.tabpage_1.dw_a.insertrow(0)
tab_1.tabpage_1.dw_a.object.s_menu[ii]="a1"
tab_1.tabpage_1.dw_a.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_1.dw_a.object.rwdp[ii]="1001"

ii=tab_1.tabpage_1.dw_a.insertrow(0)
tab_1.tabpage_1.dw_a.object.s_menu[ii]="a2"
tab_1.tabpage_1.dw_a.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_1.dw_a.object.rwdp[ii]="1001"

//系统菜单第2列
tab_1.tabpage_2.dw_b.settransobject(sqlca)
//1
ii=tab_1.tabpage_2.dw_b.insertrow(0)
tab_1.tabpage_2.dw_b.object.s_menu[ii]="b1"
tab_1.tabpage_2.dw_b.object.Smenuname[ii]="REPORT01"
tab_1.tabpage_2.dw_b.object.rwdp[ii]="1001"

//系统菜单第3列
tab_1.tabpage_3.dw_c.settransobject(sqlca)
//第1个菜单
ii=tab_1.tabpage_3.dw_c.insertrow(0)
tab_1.tabpage_3.dw_c.object.s_menu[ii]="c1"
tab_1.tabpage_3.dw_c.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_3.dw_c.object.rwdp[ii]="1001"
//第2个菜单
ii=tab_1.tabpage_3.dw_c.insertrow(0)
tab_1.tabpage_3.dw_c.object.s_menu[ii]="c2"
tab_1.tabpage_3.dw_c.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_3.dw_c.object.rwdp[ii]="1001"
//第3个菜单
ii=tab_1.tabpage_3.dw_c.insertrow(0)
tab_1.tabpage_3.dw_c.object.s_menu[ii]="c3"
tab_1.tabpage_3.dw_c.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_3.dw_c.object.rwdp[ii]="1001"
//第4个菜单
ii=tab_1.tabpage_3.dw_c.insertrow(0)
tab_1.tabpage_3.dw_c.object.s_menu[ii]="c4"
tab_1.tabpage_3.dw_c.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_3.dw_c.object.rwdp[ii]="1001"
//第5个菜单
ii=tab_1.tabpage_3.dw_c.insertrow(0)
tab_1.tabpage_3.dw_c.object.s_menu[ii]="c5"
tab_1.tabpage_3.dw_c.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_3.dw_c.object.rwdp[ii]="1001"
//第6个菜单
ii=tab_1.tabpage_3.dw_c.insertrow(0)
tab_1.tabpage_3.dw_c.object.s_menu[ii]="c6"
tab_1.tabpage_3.dw_c.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_3.dw_c.object.rwdp[ii]="1001"
//第7个菜单
ii=tab_1.tabpage_3.dw_c.insertrow(0)
tab_1.tabpage_3.dw_c.object.s_menu[ii]="c7"
tab_1.tabpage_3.dw_c.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_3.dw_c.object.rwdp[ii]="1001"


//系统菜单第4列
tab_1.tabpage_4.dw_d.settransobject(sqlca)
//第1个菜单
ii=tab_1.tabpage_4.dw_d.insertrow(0)
tab_1.tabpage_4.dw_d.object.s_menu[ii]="d1"
tab_1.tabpage_4.dw_d.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_4.dw_d.object.rwdp[ii]="1001"
//第2个菜单
ii=tab_1.tabpage_4.dw_d.insertrow(0)
tab_1.tabpage_4.dw_d.object.s_menu[ii]="d2"
tab_1.tabpage_4.dw_d.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_4.dw_d.object.rwdp[ii]="1001"
//第3个菜单
ii=tab_1.tabpage_4.dw_d.insertrow(0)
tab_1.tabpage_4.dw_d.object.s_menu[ii]="d3"
tab_1.tabpage_4.dw_d.object.Smenuname[ii]="菜单XXXX"
tab_1.tabpage_4.dw_d.object.rwdp[ii]="1001"

2.2通过双击用户名,从数据库中提取权限数据到数据窗口
双击用户名
if row<=0 then return -1
dw_find.retrieve(dw_1.object.userid[row])
st_publicname.text=dw_1.object.userid[row]
st_publiccname.text=dw_1.object.username[row]

tab_1.tabpage_1.cb_a.PostEvent(Clicked!)
tab_1.tabpage_2.cb_b.PostEvent(Clicked!)
tab_1.tabpage_3.cb_c.PostEvent(Clicked!)
tab_1.tabpage_4.cb_d.PostEvent(Clicked!)
/***********************************************/
/*cb_a单击脚本*/
/*主要功能,在数据窗口生成用户现有权限*/
long ii,trow,ii1,trow1
string smenu,srwdp
trow =int(dw_find.rowcount())
trow1=int(dw_a.rowcount())
for ii1=1 to trow1
  dw_a.object.remark[ii1]="0"
  dw_a.object.rwdp[ii1]="1001"
next

for ii=1 to trow
 smenu=left(dw_find.object.menuid[ii],2)
 srwdp=left(dw_find.object.rwdp[ii],4)
 for ii1=1 to trow1
  //dw_a.object.remark[ii1]="0"
  if smenu=dw_a.object.s_menu[ii1] then
   dw_a.object.remark[ii1]="1"
   dw_a.object.rwdp[ii1]=srwdp
  else
  end if
 next
next
//Smenuname, remark, rwdp, s_menu
/***********************************************/
3.3点击保存按钮把权限数据刷新到数据库的表中
/*3.3.1点击保存按钮*/
tab_1.tabpage_1.cb_a1.PostEvent(Clicked!)
tab_1.tabpage_2.cb_b1.PostEvent(Clicked!)
tab_1.tabpage_3.cb_c1.PostEvent(Clicked!)
tab_1.tabpage_4.cb_d1.PostEvent(Clicked!)
/*3.3.2保存按钮之一tab_1.tabpage_1.cb_a1单击事件*/
int ii,trow,frow
string usercode,username,spower,remark,smenu
usercode=st_publicname.text
username=st_publiccname.text
trow=integer(dw_a.rowcount())
for ii=1 to trow
 remark=dw_a.object.remark[ii]
 smenu=dw_a.object.s_menu[ii]
 spower=dw_a.object.rwdp[ii]
 if remark="1" then  
  select count(*) into:frow from qa_authority
  where userid=:usercode and menuid=:smenu and rwdp=:spower;
  if frow=0 then
   insert into qa_authority (userid,username,menuid,rwdp) 
   values(:usercode,:username,:smenu,:spower);
   if sqlca.sqlcode=0 then 
    commit using sqlca;   
       else
         rollback using sqlca;
       end if
  else
   update qa_authority
   set menuid=:smenu,rwdp=:spower
   where userid=:usercode and menuid=:smenu and rwdp=:spower;
   if sqlca.sqlcode=0 then 
    commit using sqlca;   
       else
         rollback using sqlca;
       end if
  end if
 else
  delete qa_authority where userid=:usercode and menuid=:smenu and rwdp=:spower;
  commit;
 end if
 remark=""
next
/***********************************************/
4.按权限打开对应的系统菜单
系统的菜单全部是不可用,当查找到它权限清单有权限时,则打开相应的菜单为enable
/*4.1自动检查用户权限的全局函数void checkUsePower()*/
/*引入了游标读取功能*/
string ls_menu
declare user_competence cursor for
 select menuid from qa_authority 
 where  userid = :g_user;

open user_competence;
fetch user_competence into :ls_menu;
ls_menu=Lower(ls_menu)

do while sqlca.sqlcode = 0
 choose case ls_menu
  //a第1列菜单
  case 'a1'
   m_main.m_a.enabled=true
   m_main.m_a.m_a1.enabled=true
  case 'a2'
   m_main.m_a.enabled=true
   m_main.m_a.m_a2.enabled=true
  //b第2列菜单
  case 'b1'
   m_main.m_b.enabled=true
   m_main.m_b.m_b1.enabled=true
  //c第3列菜单
  case 'c1'
   m_main.m_c.enabled=true
   m_main.m_c.m_c1.enabled=true
  case 'c2'
   m_main.m_c.enabled=true
   m_main.m_c.m_c2.enabled=true  
  case 'c3'
   m_main.m_c.enabled=true
   m_main.m_c.m_c3.enabled=true     
  case 'c4'
   m_main.m_c.enabled=true
   m_main.m_c.m_c4.enabled=true
  case 'c5'
   m_main.m_c.enabled=true
   m_main.m_c.m_c5.enabled=true    
  case 'c6'
   m_main.m_c.enabled=true
   m_main.m_c.m_c6.enabled=true  
  case 'c7'
   m_main.m_c.enabled=true
   m_main.m_c.m_c7.enabled=true     
  //d第4列菜单
  case 'd1'
   m_main.m_d.enabled=true
   m_main.m_d.m_d1.enabled=true
  case 'd2'
   m_main.m_d.enabled=true
   m_main.m_d.m_d2.enabled=true
  case 'd3'
   m_main.m_d.enabled=true
   m_main.m_d.m_d3.enabled=true   
   
 end choose
 fetch user_competence into :ls_menu;
loop
close user_competence;
/***********************************************/
/*4.2调用检查权限的时机*/
在用户登陆窗口,当用户选择的用户名和密码正确后调用
//g_user,g_usercode
string s_user,s_pwd
s_user=ddlb_username.text
s_pwd=trim(sle_pwd.text)
if checkuser(s_user,s_pwd)=1 then
 open(w_main_frame)//程序主窗口
 checkUsePower() //检查此用户的权限
 loginlog("in")
 close(w_login)
else
 messagebox("warning!","YOUR PASSWORD ERROR!")
 sle_pwd.SetFocus()
 sle_pwd.text=''
end if
/***********************************************/
/*5控制窗口每个按钮的权限*/
每个窗口的按钮缺省状态是不可用!
在每个窗口的open事件引入按钮检查代码
//very windows open event
string s_rwdp
select  rwdp into:s_rwdp
from qa_authority
where userid=:g_user and menuid="c3"; //此menuid是由的窗口对应的menu的ID决定的
//c3表示此窗口是由第3列菜单第3行子菜单打开的
if mid(s_rwdp,1,1)="1" then cb_r.enabled=true  //R读取按钮
if mid(s_rwdp,2,1)="1" then cb_s.enabled=true  //w保存按钮
if mid(s_rwdp,3,1)="1" then cb_d.enabled=true  //D删除按钮
if mid(s_rwdp,4,1)="1" then cb_p.enabled=true  //P打印按钮

/*表a_authority的栏位rwdp char(4) default ('xxxx') not null) ;*/
RWDP分别对应读写删印四个功能
栏位rwdp的值编码如下:
1000:只读
1001:只读与打印
1101:读,写,打印,但不能删除
1111:最大权限,说明四个按钮可用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值