用户权限管理的实现?

不胜人生一场醉 海南移动 项目总监  2003-01-02 11:25:43
本人想参照window2000的用户管理方式建立组与用户的关系
定义group(组)表
定义user(用户)表
用户只能属于组,自定义组不能相互潜套,自定义组可以属于系统组
同时用户和组对系统的控制要精确到子系统下子菜单的窗口的某个按钮
请大家提供相应的思路,高分求助!
...全文
279 点赞 收藏 28
写回复
28 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xu_pipi 2010-06-08
有没有例子啊?
回复
欢迎大家继续讨论,包括用户权限的控制程度和实现方式
回复
china_dot_com 2003-01-26
学习
回复
gogg 2003-01-24
一般情况下,没有必要控制到按钮,只要到菜单级就行啦。我们这里所有的MIS都没有控制到按钮的。有部分控制到可以检索的数据或者可以操作的列。
回复
kkbgp 2003-01-24
学习
回复
LEIBING 2003-01-24
在PB前台设好要加权限对象的Id。在后台数据库设计好一个表和它对应然后在该对象所在的窗口的OPEN事件中做如下的范围代码:
int ls_count[15]
if gs_use_id="List" then return
select m_bumen,m_yuangong,m_luduan,m_kehu,m_kehu2,m_airline,m_yunshu,m_huowu,m_quyu,m_xiadangl,m_handkong,w_xiadan_tab_1,w_xiadan_tab_2,m_quanxian,m_backup into :ls_count[1],:ls_count[2],:ls_count[3],:ls_count[4],:ls_count[5],:ls_count[6],:ls_count[7],:ls_count[8],:ls_count[9],:ls_count[10],:ls_count[11],:ls_count[12],:ls_count[13],:ls_count[14],:ls_count[15] from DL where dl_id=:gs_use_id using sqlca;
if ls_count[1]=1 then
m_main.m_xtzl.m_bumen.enabled=true
else
m_main.m_xtzl.m_bumen.enabled=false
end if
if ls_count[2]=1 then
m_main.m_xtzl.m_yuangong.enabled=true
else
m_main.m_xtzl.m_yuangong.enabled=false
end if
if ls_count[3]=1 then
m_main.m_xtzl.m_luduan.enabled=true
else
m_main.m_xtzl.m_luduan.enabled=false
end if
if ls_count[4]=1 then
m_main.m_xtzl.m_kehu.enabled=true
else
m_main.m_xtzl.m_kehu.enabled=false
end if
if ls_count[5]=1 then
m_main.m_xtzl.m_kehu2.enabled=true
else
m_main.m_xtzl.m_kehu2.enabled=false
end if
if ls_count[6]=1 then
m_main.m_xtzl.m_airline.enabled=true
else
m_main.m_xtzl.m_airline.enabled=false
end if
if ls_count[7]=1 then
m_main.m_xtzl.m_yunshu.enabled=true
else
m_main.m_xtzl.m_yunshu.enabled=false
end if
if ls_count[8]=1 then
m_main.m_xtzl.m_huowu.enabled=true
else
m_main.m_xtzl.m_huowu.enabled=false
end if
if ls_count[9]=1 then
m_main.m_xtzl.m_quyu.enabled=true
else
m_main.m_xtzl.m_quyu.enabled=false
end if
if ls_count[10]=1 then
m_main.m_xiadan.m_xiadangl.enabled=true
else
m_main.m_xiadan.m_xiadangl.enabled=false
end if
if ls_count[14]=1 then
m_main.m_xiadan.m_quanxian.enabled=true
else
m_main.m_xiadan.m_quanxian.enabled=false
end if
if ls_count[11]=1 then
m_main.m_yunjiagl.m_hangkong.enabled=true
else
m_main.m_yunjiagl.m_hangkong.enabled=false
end if
if ls_count[15]=1 then
m_main.m_xiadan.m_backup.enabled=true
else
m_main.m_xiadan.m_backup.enabled=false
end if
回复
jing31 2003-01-22
在用户表内加一个字段,这个字段就是用户组编号。
在用户组表中的字段有:用户组编号、权限代码。
权限表中有的字段:权限代码、菜单ID。

大概的意思就是这样,然后再根据具体的情况具体的分析一下,比如菜单ID可能是子系统ID等等……

回复
cai_yb 2003-01-21
mark
回复
coopa 2003-01-17
PS:如果不需要把该项功能强制禁掉,可不修改数据库,查询组功能的时候也不需要对funcid进行限制。
回复
coopa 2003-01-17
组组、组用户继承的原则是这样的
用户自定义组只能从系统组中继承,也可以在此基础上自定义权限和直接自定义权限
用户可以从多个组继承权限,也可以在此基础上自定义权限和直接定义权限

不过我在这样做的同时也会丧失一部分用户权限

组A 权限1、2、3
组B 权限2、3、4
组C 权限3、4、5

用户A继承组A组B组C拥有权限1、2、3、4、5
同时自己设定权限6,取消权限3
当组C被删除时应该具有1、2、3、4、6
但实际删除如果仅仅去掉3、4、5的话,用户A的权限就成了1、2、6
我还没找到合适的办法解决这个问题
---------------------------------------------
对于这个问题,建议你这样设计用户权限获取过程
1。用户自定义权限和组权限分开,在获取用户权限的时候,使用联合查询,分别从组权限表和用户自定义权限表中获取;
2。对于用户自定义权限的优先性,通过你的描述,你应该采用的是组权限+用户自定义权限。采用这种方式的话,要禁止用户使用多个组权限中的功能,不得不把所有包含这个功能的组关系去掉,这就造成了你前面的问题。建议你采用下面的方式:在定义用户-功能关系表时,加上一个标志字段,如果某个关系(如用户A-功能C)的标志为false,则强制把该项功能禁掉。
这样获取用户权限的查询语句可以写成这样:
select distinct funcid from role_func where roleid in (select roleid from user_role where userid='youruser') and funcid not in (select funcid from user_func where userid='youruser' and flag=false) union select funcid from user_func where userid='youruser' and flag=true。
以上观点没有经过实践,仅供参考。用到子查询,但如果管理员不多的话,应该对性能没什么影响。
回复
coopa 2003-01-17
小弟参与的一套系统中的权限控制就是小弟设计开发的,最初也是细致到每一个操作,不仅有功能的权限控制,还有管理范围的权限控制。但是在系统实施过程中,发现绝大多数情况下(因为不能看到所有,所以只能说绝大多数),超级管理员一旦分配给某个管理员一个功能模块,这个管理员就可以完全控制这个模块了。把权限细化到每一个操作会增加很多工作量,并且系统的内聚性会降低。个人觉得应该根据系统的实际应用而定。偶就吃亏在没有时间给我熟悉业务,完全从逻辑实现上去做了。
回复
mikall 2003-01-17
用PowerBuilder自带的PFC中的security实用程序来实现,代码量最小。
回复
chenfeng300 2003-01-16
再学习
回复
booksfount 2003-01-16
学习!
回复
组组、组用户继承的原则是这样的
用户自定义组只能从系统组中继承,也可以在此基础上自定义权限和直接自定义权限
用户可以从多个组继承权限,也可以在此基础上自定义权限和直接定义权限

不过我在这样做的同时也会丧失一部分用户权限

组A 权限1、2、3
组B 权限2、3、4
组C 权限3、4、5

用户A继承组A组B组C拥有权限1、2、3、4、5
同时自己设定权限6,取消权限3
当组C被删除时应该具有1、2、3、4、6
但实际删除如果仅仅去掉3、4、5的话,用户A的权限就成了1、2、6
我还没找到合适的办法解决这个问题
回复
oyj 2003-01-14
up
回复
Group_define(组定义)

字段中文名称 字段名 字段类型 主健 外健 是否为空
组名称 Group_name varchar(50) FALSE FALSE TRUE
组描述 Describe Varchar(255) FALSE FALSE TRUE
组成员名称 Member_name varchar(50) FALSE FALSE False
组类型 Grade_Type Char(1) FALSE FALSE TRUE
User_define (用户定义)

字段中文名称 字段名 字段类型 主健 外健 是否为空
用户名称 User_ name varchar(50) TRUE FALSE FALSE
用户全名称 User_full_name varchar(50) FALSE FALSE FALSE
密码 Password Varchar(40) FALSE FALSE TRUE
用户能够更改密码 Never_change Char(1) FALSE FALSE TRUE
账号是否停用 ID_stop Char(1) FALSE FALSE TRUE
用户创建日期 Create_date datetime FALSE FALSE TRUE
用户注销日期 Delete_date datetime FALSE FALSE TRUE
用户注销标记 Delete_type Char(1) FALSE FALSE TRUE
用户描述 describe varchar(255) FALSE FALSE TRUE
用户所属组 group_owner varchar(255) FALSE FALSE TRUE
类型 Type Char(1) FALSE FALSE TRUE
User_owner (用户定义)

字段中文名称 字段名 字段类型 主健 外健 是否为空
用户名称 User_name varchar(50) TRUE FALSE FALSE
用户所属组 group_owner varchar(255) FALSE FALSE FALSE
Subsystem_define (模块功能定义)

字段中文名称 字段名 字段类型 主健 外健 是否为空
子系统名称 Subsys_name varchar(50) FALSE FALSE FALSE
子系统描述 Subsys_description varchar(50) FALSE FALSE FALSE
Menu_define(菜单定义)

字段中文名称 字段名 字段类型 主健 外健 是否为空
菜单ID Menu_name varchar(50) TRUE FALSE FALSE
菜单名称 Menu_caption varchar(50) FALSE FALSE FALSE
所属模块 Subsys_name varchar(50) TRUE TRUE FALSE
command_define(命令按钮定义)

字段中文名称 字段名 字段类型 主健 外健 是否为空
按钮ID Command_name varchar(50) TRUE FALSE FALSE
按钮名称 Command_caption varchar(50) FALSE FALSE FALSE
所属菜单 Menu_name varchar(50) FALSE TRUE FALSE
所属模块 Subsys_name varchar(50) FALSE TRUE FALSE
Group_power(组权限)

字段中文名称 字段名 字段类型 主健 外健 是否为空
ID Id int TRUE TRUE FALSE
组ID group_name varchar(50) TRUE TRUE FALSE
子系统ID Subsys_ name varchar(50) TRUE TRUE FALSE
菜单ID Menu_ name varchar(50) TRUE TRUE FALSE
按钮ID Command_ name varchar(50) TRUE TRUE FALSE
User_power(用户权限)

字段中文名称 字段名 字段类型 主健 外健 是否为空
ID id int TRUE TRUE FALSE
组ID group_ name varchar(50) TRUE TRUE FALSE
子系统ID Subsys_ name varchar(50) TRUE TRUE FALSE
菜单ID Menu_ name varchar(50) TRUE TRUE FALSE
按钮ID Command_ name varchar(50) TRUE TRUE FALSE
System_log(系统登陆日志)

字段中文名称 字段名 字段类型 主健 外健 是否为空
用户ID User_ name varchar(50) TRUE TRUE FALSE
子系统名称 Subsys_ name varchar(50) FALSE FALSE FALSE
登陆机器名 Machine_name Varchar(50) FALSE FALSE FALSE
进入时间 enter_time datetime TRUE FALSE FALSE
退出时间 exit_time datetime FALSE FALSE TRUE

回复
leepoy 2003-01-14
up
回复
bbsuner 2003-01-14
以前我们公司的软件也是用这种思路来做权限的,很多软件都是这样做的,可以为组分配权限,属于这个组里的人都有这些权限,控制到最后每一个动作,
回复
QQQPPP 2003-01-13
help up
回复
加载更多回复
相关推荐
发帖
脚本语言
创建于2007-09-28

730

社区成员

PowerBuilder 脚本语言
申请成为版主
帖子事件
创建了帖子
2003-01-02 11:25
社区公告
暂无公告