基于规则的授权机制

       最近在研究微软的企业库(EntLib)时,对它的认证和授权模块很感兴趣,经过仔细研究,更进一步了解了它的机制,并把它们经过修改应用到了三层的架构上,这里不敢独享这种优秀的解决方案,把一些最简单的原理写出来给大家分享,也许经过您的努力,可以轻易把它移植到别的平台上。如果您想深入了解它的实现方法,可以参考微软的企业库程序,不过它只提供了配置文件的实现方式,基于数据库的可以参考gotdotnet上的相关实现,基于三层的实现可以和我一块探讨,下面是我对于这种解决方案的一点认识。

在通常的软件开发中,特别是关于企业信息化这一部分,认证和授权一般都是很重要的部分。在传统的解决方案里,大都是这样来实现的:

1.  先设计好各种权限

2.  创建各种角色,给每一个角色绑定各种权限

3.  对每一个用户绑定一个或多个角色

4.  授权时,根据用户的角色判断他是否具有某个权限

这种方法历史悠久,简单易懂,能解决绝大部分企业的应用,但随着企业业务复杂度的提高,它的局限性也越来越明显了,最重要的是,角色并不能很好的与实际的业务对应起来。为了解决这种问题,最近流行起来的一种全新的授权机制是基于规则的授权机制。它的实现是这样的:

1.  创建各种角色

2.  根据具体的权限定义规则

3.  对每一个用户绑定一个或多个角色

4.  授权时判断用户的角色是否满足该权限的规则。

这样听起来似乎有些模糊,不很明白究竟是怎么回事,我先举一个最简单的例子来作为说明:

假设我们定义了这样几个角色:

Sales(售货员),

SaleManager(销售经理),

ExcellenceEmp(优秀员工),

GeneralManager(总经理)

 

 

如果我们要为打折权限定义这样一种规则:

只有销售经理和总经理可以打折,可以定义如下:

NameRebate(规则名称)

ExpressionRSaleManager OR RGeneralManager (规则表达式)

       这样,当具有销售经理或总经理角色的用户登陆后,就可以拥有打折的权限,因为他们可以通过规则表达式的验证。

       当然,如果业务逻辑不同,还可以修改权限验证规则,例如:

如果我们要为打折权限定义这样一种规则:

只有销售经理和总经理以及售货员中的优秀员工可以打折,可以定义如下:

NameRebate(规则名称)

ExpressionRSaleManager OR RGeneralManager ORRSales AND RExcellenceEmp)(规则表达式)

 

 

如果我们要为打折权限定义这样一种规则:

只有销售经理和总经理以及售货员中除了名称叫XiaoMing的优秀员工可以打折,可以定义如下:

NameRebate(规则名称)

ExpressionRSaleManager OR RGeneralManager ORRSales AND RExcellenceEmp AND NOT IXiaoMing))(规则表达式)

       这些表达式也许你不容易看懂,只要你了解了授权规则的几个要素,就很容易明白了:

       I:(身份)

l         特定人员(例如:xiaoming

l         匿名用户(?)

l         任何人(*

       R:(角色)

l         特定角色(例如:SaleManager

l         任何角色(*

       关系运算符

l         AND

l         OR

l         NOT

l         ()

使用这些规则定义要素,可以定义出非常复杂的规则表达式来,应该能满足更大范围内的业务需求。

如果我们把这些角色和规则都存储在数据库中,我们就可以随时修改用户的角色和授权规则,这样就可以更大程度上满足用户自定义规则的要求,使其更符合企业实际业务的要求。

当然,上面这些都是关于授权的,授权一般有一个前提,就是通过了认证(其实没有认证也是一种认证,标明你是匿名用户),认证一般较简单,没有什么特殊的地方,有一点较重要,就是可以把认证后的信息缓存起来,不用每次授权都重新认证,也可以把认证信息存储到本地,这在开发离线程序时很有用。

你可能感兴趣的:(dotnet)