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)"出现的文字描述皆为关键字。