关于多级权限管理的一个问题,请求指点~

avenger 2002-07-05 12:38:11
最近在做一个文章分级查看的程序中碰一点小麻烦:

情况是这样的:
一个有偿的文章浏览程序.文章分类共有三十个类别.
每个类别只有为该类别付费的用户才能查看,(每个类别都是单独付费的)
用户表中已经有了一个权限字段.希望哪位大虾能给个算法.一百分奉上.

我刚开始的思路:
用一个三十位长的字符串来判断.进入类别N,就从左边取出第N位的字符,与1相比,是1就有权限,否则没有.
可是这种方法在应用中,有点问题:
1.在添加一个栏目或删除一个栏目时,很不方便,要把所有用户的权限字段更新一遍.
2.用字符串大大降低了程序的可用性,效率太低.

希望对这方面有经验的朋友能不吝赐教.先谢过了~~
...全文
203 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
avenger 2002-08-19
  • 打赏
  • 举报
回复
问题已解决.谢谢大家
ckr_x 2002-07-08
  • 打赏
  • 举报
回复
设定:
 从基本模型出发,用户、功能模块、作用域 、动作、权限表等均以功能实现为目的,进行最小化设定。如:用户表简化成简单的编号、名称、等字段。
范围:
不负责用户的管理,
不负责功能模块参数表的维护,
不负责作用域的维护
负责动作表的维护
负责权限表的维护
词汇说明
模块:指程序中的功能块,功能单位,不可再分
作用域:在模块H中的动作对象,不可再分,在模块H中应有唯一的作用域
用户:包括编号信息、名称信息、
功能区:指的是系统的大的模块的划分
功能要求:
设定权限
修改权限,
确定权限
功能描述:
表达式1:用户A在功能模块H中动作R允许
示例: 用户A在课题管理模块中课题录入允许
表达式2:用户A在功能模块H中作用域M内动作R允许
示例: 用户A在成绩录入模块中六年级 成绩录入允许

成员及相关操作:
用户:
增加
默认权限为空,手动指定权限
修改
仅指针对用户的权限的修改
删除
删除用户所拥有权限
权限:
1. 权限控制基本单位是动作,描述功能模块H中作用域M内动作R。
2. 一个作用域可以同时属于若干个模块,在各模块中的功能可以不同。

数据表设计及其间关系
对于表达式2的反推:
用户A
功能模块H中
作用域M内
动作R
允许

前提:
a) 系统功能区划分已知
b) 系统中所有的用户已知
c) 系统中所有的模块已知
d) 系统中所有的动作已知
e) 模块中所有作用域已知

需要手动解决的问题:
a) 设定模块H对应的作用域和数据表
b) 设定模块H对应的动作
如果模块H对应的作用域不是”Common”
1. 设定用户A在模块H中的作用元素(o)
2. 设定用户A在模块H中对作用元素(o)的动作X
否则
1. 设定用户A在模块H中的动作X
结束

1. 用户表:编号、用户名称

编号 用户名称
1 Admin
2 Demo
3 Guest
4

2. 模块表:编号、模块名称、功能区编号
功能区编号这一字段仅为了更好地分类列示所有模块而设计。同时也是系统大的功能模块划分。
编号 模块名称 模块位置 功能区编号
1 学生基础信息管理 Xsjc.aspx 1
2 教师入校管理 Jsrx.aspx 3
3 课题管理 Ktgl.aspx 5
4 学生异动管理 Xsyd.aspx 2
5 班级信息管理 Bjxx.aspx 4
6 系统参数维护 Xtcs.aspx 10
7 数据备份 Sjbf.aspx 10
8 学生毕业管理 Xsby.aspx 2
9 课外活动小组管理 Kwhd.aspx 4
10 教研组管理 Jyz.aspx 5
11 论文管理 Lw.apx 5
12 固定资产分类 Zcfl.aspx 6
13 固定资产登记 Zcdj.aspx 6
14 图书编目 Tsbm.aspx 7
15 图书借阅 Tsjy.aspx 7
16 图书数据维护 Tswh.aspx 7
17 学校基础信息管理 Xxjc.aspx 1
18

3. 作用域表:编号、作用域名称、数据表(当作用域为空时,不需要指定数据表)
例:班级是作用域,教研组是作用域,年级是作用域… …因为当针对某一班中学生进行相关操作时,此时,集合是班;当针对某一年级中的若干班进行操作时,集合是年级。当遇到A用户同时要操作H年级M班,和I年级N班时,可以采用H*M的形式,将作用域提升。前提是在H*M的集合中,M的值具备唯一性,即不能存在相同的M值。

编号 作用域名称 数据表
1 Common
2 班级 班级信息表
3 教研组 教研组表
4 课外班 课外班表
5 年级 年级表
6
对于Common这一特殊作用域,用来处理不需要进行区域限制的动作,当遇到作用域名称为’Common’时,则忽略数据表的属性。

4. 动作表:编号、动作名称

编号 动作名称
1 录入
2 修改
3 删除
4 转入
5 转出
6 休学
7 复学
8 退学
9 查询
10 维护
11

5. 模域关系表(模块作用域对应关系表):编号、模块编号、作用域编号

编号 模块编号 模块名称 作用域编号
1 1 学生基础信息管理 2
2 2 教师入校管理 1
3 3 课题管理 1
4 4 学生异动管理 1
5 5 班级信息管理 5
6 6 系统参数维护 1
7
模块的对应关系参见模块表。在建立表5时,事实上并不存在“模块名称”这一字段,在些显示出来,仅为了表达模块的内容。
模块1(学生基础信息管理),允许实现以班级为单位的分布式管理,即符合表达式2,不同的班级可能需要不同的用户进行管理。
模块3、4、5在学校内一般是由相应的部门进行集中式管理,即符合表达式1。

6. 模动关系表(模块动作对应关系表):编号、模块编号、动作编号
编号 模块编号 模块名称 动作编号 说明
1 1 学生基础信息管理 1 基础信息录入
2 1 学生基础信息管理 3 基础信息删除
3 2 教师入校管理 1 教师录入
4 3 课题管理 1 课题录入
5 3 课题管理 2 课题编辑
6 3 课题管理 3 课题删除
7 4 学生异动管理 4 学生转入
8 4 学生异动管理 8 学生退学
9 5 班级信息管理 1 班级信息录入
10 5 班级信息管理 2 班级信息修改
11 5 班级信息管理 3 班级信息删除
12 6 系统参数维护 1 系统参数录入
13 6 系统参数维护 2 系统参数修改
14 6 系统参数维护 3 系统参数删除
15
16

7. 权限表:编号、模块动作对应编号、元素、许可
根据模块与动作对应编号,析取得模块编号与动作编号,再依据模块编号取得作用域名称,依据作用域名称是否关键字’Common’,判断是直接得到许可还是根据数据表以及元素编号取得许可。
编号 用户编号 说明 模动编号 元素编号 许可
1 1 基础信息录入 1 1 1
2 1 基础信息删除 2 4 0
3 1 教师录入 3 1
4 1 课题录入 4 0
5 1 课题编辑 5 1
6 1 课题删除 6 1
7 1 学生转入 7 0
8 1 学生退学 8 1
9 1 班级信息录入 9 1 0
10 1 班级信息修改 10 1 1
11 1 班级信息删除 11 1 1
12 1 系统参数录入 12 0
13 1 系统参数修改 13 0
14 1 系统参数删除 14 0
15 1 基础信息录入 1 2 1
16 1 基础信息录入 1 3 0
17 1 基础信息录入 1 4 1
18 1 基础信息删除 2 1 0
19 1 基础信息删除 2 2 0
20 1 基础信息删除 2 4 0
21 1 班级信息录入 9 2 1
22 1 班级信息修改 10 2 1
23 1 班级信息删除 11 2 0
24 1 班级信息录入 9 3 1
25 1 班级信息修改 10 3 1
26 1 班级信息删除 11 3 1
27 2
28 2

8. 班级表:编号、班级、年级

编号 班级 年级
1 班级A 年级A
2 班级B 年级A
3 班级C 年级A
4 班级D 年级A
5

9. 年级表:编号、年级

编号 年级
1 年级A
2 年级B
3 年级C
4 年级D
5

10. 功能区表:编号、功能区名称
属于架构性质表
编号 功能区名称 功能区位置
1 基本信息管理 /jbxx/
2 学籍管理 /xjgl/
3 教师管理 /jsgl/
4 教务管理 /jwgl/
5 教研管理 /jygl/
6 校产管理 /xcgl/
7 图书管理 /tsgl/
8 办公管理 /bggl/
9 数据上报 /sjsb/
10 系统管理 /xtgl/


使用
验证:
无作用域限制的:
要求判断:用户A在功能模块H中动作R允许
语句:
SELECT a.ID, b.用户名称, d.模块名称, e.动作名称, a.许可, g.作用域名称
FROM 权限表 a INNER JOIN
用户表 b ON a.用户编号 = b.ID INNER JOIN
模动关系表 c ON a.模动编号 = c.ID INNER JOIN
模块表 d ON c.模块编号 = d.ID INNER JOIN
动作表 e ON c.动作编号 = e.ID INNER JOIN
模域关系表 f ON c.模块编号 = f.模块编号 INNER JOIN
作用域表 g ON f.作用域编号 = g.ID
WHERE (g.作用域名称 = 'Common') AND (b.用户名称 = 'Admin') AND (d.模块名称 = '教师入校管理') AND (e.动作名称 = '录入')
说明:此判断兼容性较强,使用时,指定作用域是’Common’,然后指定A,H,R参数。

受作用域限制的:
要求判断:用户A在功能模块H中作用域M内动作R允许
说明: 依赖于具体的集合,包括字段名称,表名称,因此要带一个条件指定特定数据表,其依赖性在下面的示例语句中,使用红色的字体标识出来。
语句1:
SELECT a.ID, b.用户名称, d.模块名称, e.动作名称, a.许可, h.年级名称
FROM 权限表 a INNER JOIN
用户表 b ON a.用户编号 = b.ID INNER JOIN
模动关系表 c ON a.模动编号 = c.ID INNER JOIN
模块表 d ON c.模块编号 = d.ID INNER JOIN
动作表 e ON c.动作编号 = e.ID INNER JOIN
模域关系表 f ON c.模块编号 = f.模块编号 INNER JOIN
作用域表 g ON f.作用域编号 = g.ID INNER JOIN
年级表 h ON a.元素编号 = h.ID
WHERE (b.用户名称 = 'Admin') AND (d.模块名称 = '班级信息管理') AND (h.年级名称 = '年级A') AND (e.动作名称 = '录入')
注意:先行取得表名,再计算得关键字字段,通过程序动态生成@ckr_elementid以后的SQL语句。在此最好不要只使用一个语句完成。
语句2:
SELECT a.ID, b.用户名称, d.模块名称, e.动作名称, a.许可, h.班级名称
FROM 权限表 a INNER JOIN
用户表 b ON a.用户编号 = b.ID INNER JOIN
模动关系表 c ON a.模动编号 = c.ID INNER JOIN
模块表 d ON c.模块编号 = d.ID INNER JOIN
动作表 e ON c.动作编号 = e.ID INNER JOIN
模域关系表 f ON c.模块编号 = f.模块编号 INNER JOIN
作用域表 g ON f.作用域编号 = g.ID INNER JOIN
班级表 h ON a.元素编号 = h.ID
WHERE (b.用户名称 = 'Admin') AND (d.模块名称 = '学生基础信息管理') AND (h.班级名称 = '班级A') AND (e.动作名称 = '录入')
注: where 条件中的XX名称也可以用ID字段代替,后面的值改成相应的整数即可。如 where (b.id = 1) and … …
此判断兼容性较差,需要先行明确作用域对应的数据表,并且需要明确作用元素的唯一性字段,然后指定A,H,M,R参数。
赋予:
无作用域限制的:
如:”学校基础信息管理”
前提:
 建立了功能区”基本信息管理”,
 功能区下有模块”学校基础信息管理”,
 指定作用域为”Common”,数据表为空,
 指定允许执行的动作包括”录入”,”维护”
操作:
1. 选择基本信息管理,
2. 选择学校基本信息管理,
3. 选择动作
4. 在文本域或者在列
avenger 2002-07-08
  • 打赏
  • 举报
回复
现在这个问题已经解决了.
Avenger采用的是这个方法.
把栏目表和会员表分别加一个权限字段.
栏目一的字段值是2
栏目二的字段值是4
栏目三的字段值是8
.
.
.
栏目N的字段值是2^N

如果会员一有栏目一和三的权限,那么会员一的权限字段即为2+8 =10.
会员登录后,取出该字段与要进入的栏目进行 "与(and)" 操作.
若结果为0,说明没有权限.否则没有权限.

不知道我现在采用的这种方法,大家认为如何 ?
avenger 2002-07-05
  • 打赏
  • 举报
回复
楼上所说的还是没有脱离字符串.效率也上不去.
有没有更好的方法.

前几天我一个会用php的朋友用php的位运算功能实现了这个功能.
不知道asp还有没有更好的算法.

期待中~
ehom 2002-07-05
  • 打赏
  • 举报
回复
很简单,字符串中用","或"|"等特殊字符隔开类别!
avenger 2002-07-05
  • 打赏
  • 举报
回复
要实现的过程是求一个算法,让有相应栏目权限的用户能进入相应的目录,并且在增加和删除栏目时不会出错.
zippooo 2002-07-05
  • 打赏
  • 举报
回复
t
zippooo 2002-07-05
  • 打赏
  • 举报
回复
用一个存储过程取得登陆用户的所有权限字符串,如1rw,2d,3rad,其中1,2,3代表模块,r,w,a,d代表读,写,追加,删除权限
进入模块的时候用一个函数来判断是否具有该模块的一种操作权限,如
模块1的r读权限:
IsPriority("1","r")如此便是对该页面进行了硬编码,如何有好的方法避免之?借本贴请教!
avenger 2002-07-05
  • 打赏
  • 举报
回复
我还是认为不太好。
可能是我没完全理解。
我现在做这个共有三十个类别。

文章只是用来查看的。就是那种付费查看文章类型的
有权限能看,否则不能看。
就这么简单。

zhf的方法,我还是有点头晕~~~~
Symanteck 2002-07-05
  • 打赏
  • 举报
回复
有“,”隔开很好啊
ss="a,b,c,d"
arr=split(ss,",")
这样就可以返回一个字符串数组。
zhf_karen 2002-07-05
  • 打赏
  • 举报
回复
可以,再建立一个权限列表,比如读取表示一,修改表示为二,然后在权限表里引用.但一般来说,对应一个具体操作,权限基本是固定的,最多也就是按照Notes的概念分为7种权限.
而且建立起来以后,维护权限的关系还有和程序的接口比较难做,所以一般如果没有特殊需要也就那么做了.
zippooo 2002-07-05
  • 打赏
  • 举报
回复
在做的一个项目就是采用了这种权限控制方法,另加入了组的概念,及修改,增加,删除,浏览等细分权限,就是在模块控制的时候,如阅读则硬编码1,修改硬编码2,不知道有没有好的办法不使用硬编码?
zhf_karen 2002-07-05
  • 打赏
  • 举报
回复
我不讨论组了,就讨论简单的方式.
用户表:
ID Name...
1 .......
权限表:
ID Title Right
1 小说 阅读(可以用数字表示,比如1)
2 词汇 修改(2)
用户权限对应表:
UserID RightID
1 1
1 2
表示一号用户有权限一,权限二.如果你添加一个新模块,就是给需要的用户添加连接就可以了,缺省情况下,他们没有权限,购买了以后再开通,如果删除一个模块(比如模块1),那直接拿掉对应表中所有RightID为1的对应就可以了
avenger 2002-07-05
  • 打赏
  • 举报
回复
楼上朋友所说的,我有点不太理解。
能否再详细点。谢谢了。谢谢。
zhf_karen 2002-07-05
  • 打赏
  • 举报
回复
你的数据库已经如此设计了,没有什么特别好的方法.至于位与操作也不能从根本上解决你的问题,以下是我们使用权限的方法(用或方法)
实际上就是比如你用的是自符串的101010方式,我对他的理解是两进制文件.使用****(权限码) and 模块码,分解出0,1,11,表示三种权限.
但存在的问题是:权限层是是固定的(比如我们不可能设定编辑,修改,阅读,不允许阅读三种权限),将来修改困难,二来,我们给本来没有意义的0101设定了意义,将来程序维护困难,就象你说的添加功能模块和删除功能模块.
我的建议是建立三种表:用户表,权限表,用户权限对应表.当然如果为了配置方便,你可以把用户归组,然后对组赋权.这样你删除模块的时候,就不用去修改那些字符串,直接取消对应关系就可以了.相对容易维护一些.
不知道是否对你有帮助
julyclyde 2002-07-05
  • 打赏
  • 举报
回复
其实还是用位表示最好
avenger 2002-07-05
  • 打赏
  • 举报
回复
但是这样做并没有做到尽善美.
希望能有更好的解决办法.

期待中~~
hchxxzx 2002-07-05
  • 打赏
  • 举报
回复
这个办法好,与楼主的意思可能相符
楼主的办法是用一个固定的字符串表示可看否,楼上的意思是用变化的字符串表示可看否,加标识符是有利于查询的时候得到正确的结果
这个回答应该可以满意,我也学到了
ehom 2002-07-05
  • 打赏
  • 举报
回复
我是说用","或"|"隔开栏目的唯一标识符,如|1|2|,表示可以看栏目1和2.只要判断一下要看的栏目|N|在不在|1|2|中!

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧