常见的权限管理模型

2 views
Skip to first unread message

Cat

unread,
Oct 7, 2005, 3:12:00 AM10/7/05
to ZSU...@googlegroups.com
1.这是开头第一步,也是很重要的一步,就是觉得权限颗粒度。什么叫做权限颗粒度?就是划分一个权限定义有多小。例如,如果权限仅仅划分到"使用电脑",对比起再细分到"使用电脑玩游戏"和"使用电脑上网",那么明显颗粒度就大很多。然而颗粒度也不是越小越好,因为太小了,就会增加编写的代码和增加运算符和。例如成绩登记系统,如果只要是计算机系的老师就有足够的权限添加/更改计算机系相关的成绩,那当然颗粒太大了,现在一般做到的是自动和课程安排关联只有任教老师能够添加成绩,更改成绩需要上报审核。如果颗粒再小一点,你可以考虑有些学院可能不希望老师评太多的不及格,那么权限颗粒就细分到"填写60分或以上成绩"及"填写60分以下成绩"两个,后者需要审核或者只有上级拥有权限。然后你还可以YY,会不会有学院不允许太多90分?甚至分数划分边界能够随意调整?颗粒细分是一个可以无限YY下去的问题,所以要掌握好一个系统到底需要什么样的颗粒。

2.颗粒划分好了,也就是有了所谓的"权限(Permission)"。权限并没有指"明谁可以做什么",仅仅用于指明"可否做什么"是一个可控制变量。

3.然后我们来划分"用户(User)",用户就是使用者在使用系统时的"身份(Identity)"。通常这个身份使用"用户名(Name)"和"密码(Password)"配对来确认,也可能不用用户名而用"电子邮件(Email)"。有些特殊情况下,仅仅使用密码来确认身份,特别是足够长的密码(例如电话充值卡的密码),配合上若干次错误输入就锁死。假设用户名为8位,密码为8位,对于穷举解密者来说其实这和一个16位密码是一样的。

4.但我们把权限与用户关联起来之后,就形成了"特权(Privilege)",这才是"某某人可以做什么"的一个设置。

5.我们很多时候希望若干个用户拥有的共同性质一次性设置,并且同步修改,好像基类一样,这样就出现了"用户组(Group)"或者是"角色(Role)",任意多个用户可以和任意多个用户组关联,自动继承用户组的设定。

6.然后多继承的问题就出现了。例如一个用户属于两个用户组,两个用户组对某一项权限的设置刚刚好相反,一个是"允许(Permit)",一个是"禁止(Denied)"。这时候我们就想到需要各个用户组对于这些设置要有一个"优先级(Priority)"的设置,但是基于权限设置的非依赖性,我们不可能直接设置这条"规则(Rule)"优先与另一条规则——因为我们根本不确定另一条规则是否存在。所以一般系统采取了如下的优先级设置:禁止〉允许〉"不设置(NotSet)",不设置也就是Null,或者你理解成别的也行,反正和禁止一样,你可以把这个模型简单理解为"高级禁止〉允许〉低级禁止",然后你就会发觉原来这样已经完全够用了!这和实际情况中无论你有多少层上级下级皆可简化为"上级/平级/下级"3类是一样的,凡是上级你都必须让他优先,凡是下级他都要让你优先,就这么简单。可能有人会提出"高级允许〉禁止〉低级允许"的模型,虽然这是可行的,但因为默认规则一般就是最低级规则,很是系统是默认允许的,所以也就没有人用这个模型。

7.上述模型对于好像文件系统的"目录(Directory)"结构的继承一样有效,例如你允许别人访问c:\a,不允许别人访问c:\a\b,但又允许别人访问c:\a\b\c。那么对于前两条,你需要做的仅仅是对c:\a\b增加一条禁止规则。不过对于第三条,你需要"禁用(Disable)"继承,然后重新创建允许规则了。

上面所有通过"某些东西(Something)"出现的文字描述皆为关键字。

Reply all
Reply to author
Forward
0 new messages