创建:5/16/2005
最后更新:5/16/2005
编写:谈少民 SteveTan
Email:tansm@21cn.com
摘要:本文从另外一种角度来设计权限解决方案,详细解释了如何使用范围、授权和证书的概念来处理复杂的权限问题。
目录:
说在前面的
在讲这个所谓的“终极”解决方案之前,我想先说明几点:
1、首先所谓的“终极”是我认为的“终极”。我对当今世界的权限处理的“国际水平”并不了解太多,只知道一些典型的“Who,How,What"模型,什么角色。如果你现在就异常失望了,那真是对不起,浪费了您宝贵的时间,请现在关闭窗口;
2、看这篇文章,我假定你已经有一些权限设计的实际开发经验和知识。
权限设计案例
在以前的几年的开发中,总是遇到这种复杂的权限设计需求,我将从简单到复杂的罗列一下:
总经理可以处理凭证的所有功能;
财务只能处理未审核的单据的所有功能;
分公司的经理可以审核他所负责的区域的所有单据;
你首先现在需要思考的是:你以前设计的系统都是与此相似的要求吗?哦,如果比这里更多,没有关系,继续看。
当然,为了说明问题,我还是用一个简单的例子:
一家健身俱乐部,有普通运动室和豪华运动室,客户分VIP客户和普通客户,总经理规定只有VIP客户才能使用豪华运动室(谁说有钱没有用 :( ),OK,现在一个客户买了一张VIP卡,然后这次客户来消费,走到豪华运动室门口,服务生检查了他的卡,然后客户就可以进去消费了,好简单的一个问题。
我的解决方案
还是单刀直入讲我的解决方案,用“范围、授权和证书”的概念怎么解释上面的案例呢?
1、首先我认为这里有个叫“场地”的范围,即一种限制方式。
2、俩种客户,在这里理解为俱乐部承认的俩种证书。
3、总经理的规定,是一个“授权”行为,在计算机中相当于点击“权限设置”功能,如下图:
每个授权包含俩个部分:授权的范围,和此授权必要的证书。在上面的例子中,授权1对普通运动室做了“允许”授权,条件是你有“普通会员证书”,第二个是一样的道理。
4、客户购买VIP卡,是一个具体用户的证书颁发过程,他拥有了这个证书;
5、客户走到豪华运动室门口,想进去玩玩,相当于在软件中,他要去执行某个功能。这里的服务生相当于我们的程序,他做了一个“断言”,他是怎么做的呢?
循环检索所有已有的授权;
当他拿到一个授权时,判断这个客户是否能够提供授权需要的所有证书;
如果能够全部提供,代表通过,否则下一个,直到检索完所有的授权都没有,那就说:先生,没钱你跑这儿干嘛? :-)
明白了吗?不要去想权限的事情,把这件事情的处理方法搞懂了再看下面的。
实际编程的问题一一攻克
也许你要大叫:老兄,说权限,你扯哪了。 OK,言归正传,先说最简单的那个问题
总经理可以处理凭证的所有功能;
我分解为:
范围:包括1个“模块类型”的范围,范围在程序中使用一个IRegion接口定义
2
3 namespace Taysoft.Common.Security
4 {
5 /// <summary>
6 /// Define region state
7 /// </summary>
8 public enum RegionState
9 {
10 /// <summary>
11 ///
12 /// </summary>
13 Normal = 0,
14 Max = 1,
15 Min = 2
16 }
17
18 /// <summary>
19 /// This interface describes the privilledge scope of security.
20 /// </summary>
21 public interface IRegion
22 {
23 /// <summary>
24 /// Return region state
25 /// </summary>
26 RegionState State{get;}
27 }
28}
29
30