最近在研究微软的企业库(EntLib)时,对它的认证和授权模块很感兴趣,经过仔细研究,更进一步了解了它的机制,并把它们经过修改应用到了三层的架构上,这里不敢独享这种优秀的解决方案,把一些最简单的原理写出来给大家分享,也许经过您的努力,可以轻易把它移植到别的平台上。如果您想深入了解它的实现方法,可以参考微软的企业库程序,不过它只提供了配置文件的实现方式,基于数据库的可以参考gotdotnet上的相关实现,基于三层的实现可以和我一块探讨,下面是我对于这种解决方案的一点认识。
在通常的软件开发中,特别是关于企业信息化这一部分,认证和授权一般都是很重要的部分。在传统的解决方案里,大都是这样来实现的:
1. 先设计好各种权限
2. 创建各种角色,给每一个角色绑定各种权限
3. 对每一个用户绑定一个或多个角色
4. 授权时,根据用户的角色判断他是否具有某个权限
这种方法历史悠久,简单易懂,能解决绝大部分企业的应用,但随着企业业务复杂度的提高,它的局限性也越来越明显了,最重要的是,角色并不能很好的与实际的业务对应起来。为了解决这种问题,最近流行起来的一种全新的授权机制是基于规则的授权机制。它的实现是这样的:
1. 创建各种角色
2. 根据具体的权限定义规则
3. 对每一个用户绑定一个或多个角色
4. 授权时判断用户的角色是否满足该权限的规则。
这样听起来似乎有些模糊,不很明白究竟是怎么回事,我先举一个最简单的例子来作为说明:
假设我们定义了这样几个角色:
Sales(售货员),
SaleManager(销售经理),
ExcellenceEmp(优秀员工),
GeneralManager(总经理)
如果我们要为打折权限定义这样一种规则:
只有销售经理和总经理可以打折,可以定义如下:
Name:Rebate(规则名称)
Expression:R:SaleManager OR R:GeneralManager (规则表达式)
这样,当具有销售经理或总经理角色的用户登陆后,就可以拥有打折的权限,因为他们可以通过规则表达式的验证。
当然,如果业务逻辑不同,还可以修改权限验证规则,例如:
如果我们要为打折权限定义这样一种规则:
只有销售经理和总经理以及售货员中的优秀员工可以打折,可以定义如下:
Name:Rebate(规则名称)
Expression:R:SaleManager OR R:GeneralManager OR(R:Sales AND R:ExcellenceEmp)(规则表达式)
如果我们要为打折权限定义这样一种规则:
只有销售经理和总经理以及售货员中除了名称叫XiaoMing的优秀员工可以打折,可以定义如下:
Name:Rebate(规则名称)
Expression:R:SaleManager OR R:GeneralManager OR(R:Sales AND R:ExcellenceEmp AND (NOT I:XiaoMing))(规则表达式)
这些表达式也许你不容易看懂,只要你了解了授权规则的几个要素,就很容易明白了:
I:(身份)
l 特定人员(例如:xiaoming)
l 匿名用户(?)
l 任何人(*)
R:(角色)
l 特定角色(例如:SaleManager)
l 任何角色(*)
关系运算符
l AND
l OR
l NOT
l ()
使用这些规则定义要素,可以定义出非常复杂的规则表达式来,应该能满足更大范围内的业务需求。
如果我们把这些角色和规则都存储在数据库中,我们就可以随时修改用户的角色和授权规则,这样就可以更大程度上满足用户自定义规则的要求,使其更符合企业实际业务的要求。
当然,上面这些都是关于授权的,授权一般有一个前提,就是通过了认证(其实没有认证也是一种认证,标明你是匿名用户),认证一般较简单,没有什么特殊的地方,有一点较重要,就是可以把认证后的信息缓存起来,不用每次授权都重新认证,也可以把认证信息存储到本地,这在开发离线程序时很有用。