2014-09-02 69 views
0

我有一个问题,那就是确保在我的SOA应用程序中正确授权的最佳实践/模式是什么。我有一堆允许用户访问某些数据(存储在数据库中)的服务。典型场景的一个例子是...在SOA中实现授权

我们有一个EMPLOYEE表,它与PROJECT有一对多的关系。所以一个雇员可以有很多项目。另外每个员工都属于一个地区。系统的用户可以编辑员工和项目的信息。但是,每个用户只能管理少数几个区域的数据,因此只能修改属于用户管理区域的员工及其项目。因此,用户可以访问区域A,B,C,并且可以编辑区域A员工的员工/项目数据,但不能编辑区域Z员工。

我有一项服务可让您编辑员工,另一项可编辑项目。类似地,项目与其他实体有关系,例如, SCHEDULE,我也有服务来编辑这些内容。

但是我的问题是,用户是否可以通过调用相应的服务来编辑项目或计划,取决于员工(与这些项目和计划相关的)属于哪个区域。因此,对于每一项修改项目或计划的服务或从员工开始的该层次数据中的任何实体,我都必须查询相应的员工并强制执行区域约束。考虑到数据库调用和连接数量(我真正的例子有很多这样的实体和相应的服务),这可能会变得非常昂贵,我必须在每次服务调用时进行操作。针对我的场景是否有更优雅的轻量级解决方案?

回答

1

首先,我会将这些要求称为常规业务规则而不是授权。授权通常在本质上更具通用性,这意味着用户是被允许访问特定系统还是被允许调用某个功能(不管参数如何)。其次,基于业务规则视图,在将业务划分为服务之前,应考虑这些业务规则的一致性需求。第三,关于你的陈述“我的真实例子有很多这样的实体和相应的服务”,它通常不是一个好主意,有与实体相对应的服务。

因此,总之,您需要重新设计您的服务边界,以便需要执行的规则(以高度一致的方式)包含在单个服务中。一种方法是将某个特定实体的不同部分放入不同的服务中 - 前提是没有任何业务规则要求这些不同的一致性