[经验]渚薰的ASP畅谈(二)分级权限技术☆☆☆☆
|
|
- 分级权限,这是一种很有用的控制用户权限的技术。这在一个多人管理网站运作的情况下,是及其必要的。因为,你并不想一个小小的文章录入员,一秒内就把网站运行了一年的数据库资料给初始化了。虽然这个技术很诱人,但是,它的实现实际上并不能那么轻松。即使只有一个普通管理员和一个系统管理员两个权限,也必须考虑众多的情况。特别是要避免低权限通过某种页面访问途径直接访问到高权限的功能的情况。极端的情况是,在一个页面里,也要分清谁有添加的权限,谁有删除的权限(这似乎会让我短命一年以上)。
- 并不收欢迎的一种实现技术-关键字识别
- 说它不受欢迎,第一个让我抱怨的理由就是,我并不认识那么多英语单词……特别是不能准确表达汉语的意思。假如你过了专业八级,我倒推荐你用这种方法,至少它够直白。
- 一般来说,这个技术就是通过每个权限设置一个关键字,比如读取权限就是read(或者r),写入权限就是write(w),追加权限就是append(a)等等。这些关键字是可以组合的。比如rw,就是既拥有读取权限,又拥有写入权限。但设想,假如权限超过26个,那么单字母肯定不够用,得用整个单词或多一点字母的缩写。那又假设,权限超过100个,那么总管理员的权限字符串就够你输入的了……
- 但,要识别权限到挺简单的,用个instr函数就可以识别是否拥有指定权限了。得说明一下的是,千万不要把权限组合成这样readwriteadd(显然我不会照 词,这里并没有重复单词的现象)。必须以某个特定的符号来分割各个权限。而ASP中习惯用来分割的符号是"|"(某人会问我它在哪?按住Shift键,再按反斜杠,它就在了) ,例如read|write|add。
- 权限不在多,一个整数值就行(显然我的古文基础不好,并不押韵)-位掩码识别
- 认识计算机,我们就等于认识了0和1。计算机一个字节有8个位组成,每一位不是0就是1。这些0和1组成了二进制代码(OK,以上是废话,大可以略过)。那么位掩码到底是什么东西呢?假设一个8位二进制数,每一位,就表示一个权限,0表示不拥有,1表示拥有,那么如同这样的二进制数10100100就可以很明确的知道,拥有那些权限和没有拥有那些权限。
- 权限组合
有人会疑问了,这样的0、1串,怎么可能用来组合那么多权限呢,不就只有2个数字嘛?那就错了,一个8位二进制数可以表示256个数哦。但是,我们并不能用的了那么多。我们把这个8位二进制数11111111分离开来,变成10000000+1000000+100000+10000+1000+100+10+1(十进制分别是256+128+64+32+16+8+4+2+1),一共8个数,对应8个权限。那么,拥有某个权限,就可以把这个权限所对应的值加上去。这就组合了不同权限。这会产生冲突吗?下面做解答。
- 权限识别
由于,每个权限,实际上是8位中的某一位。也就是,拥有该权限该位就是1,而不拥有就是0。显然,这并不会出现冲突的现象。那,组合了权限后,改怎么识别呢?我们存储权限值是用十进制数来存储的,比如153。一眼看去,它绝对没任何含义。但是别忘了,它的二进制形式,可以充满了意义,010010111,是0就表示不拥有,是1就表示拥有。问题随之而然的转移到该怎样确定一个二进制数位上到底是1还是0。这里,要拿出大家学高级语言以来,使用率最低的一个运算符“位与”(也许当你学了汇编语言后,你会很重视它)。位与,就是比较两个数的二进制数的对应位,如果两者都是1,那么结果就是1,否则就是0。我们用010000000和上述二进制数进行“位与”运算得到的结果是010000000(153位与128=128)前者是拥有的权限组合,后者是当前权限的值,结果是当前权限的值,如此就表明该用户拥有该权限。又假如,我们用00100000和上述二进制数进行“位与”运算得到的结果是00000000(153位与64=0),很明显,该用户并不拥有该权限。这样,权限组合就被正确的识别出来了。同样,当前权限也可以是权限的组合。比如,用户权限值是153,当前权限是68,位与操作后结果=4,显然,它并不拥有当前的所有权限。一般来说用户权限值“位与”当前权限值={1、当前权限值 2、0 3、其他}。1表示用户拥有当前权限,2表示用户完全不拥有当前权限,3表示用户部分拥有当前权限。相信大家都焦急了,我故意放到最后来说,那么VBScript里的位与操作符是什么呢?答案是“and”。
- 位掩码技术,并不只是可以运用到分级权限上,而且可以运用到各类需要识别大量不同属性值的情况上。比如调查表的选项设置。
- 应该做到灵活多变
相信,如果权限到超过100个,那么就要设置100个数,虽然这比写单词方便多了,但是要计算2的100次方可不是那么容易的。所以,弊端还是有。关键是我们要怎么懂得灵活应用这两种方式。不用说,大家应该想到了,即用关键字识别,又用位掩码识别。比如,第一级权限用关键字识别,第二级权限用位掩码识别。 |
|
[此贴子已经被作者于2006-8-7 21:36:46编辑过]