波斯码BOSSMA Information Technology

细粒度数据权限控制的探索(1)

发布时间:2010年6月8日 / 分类:ASP.NET / 次浏览 / 评论

做程序一段以时间以后,对基于角色的权限控制已经比较熟悉了,定义一系列的功能,然后设置每个角色可以访问的功能。但是这对于稍微复杂的业务逻辑来说,就有点勉强了,因为会涉及数据权限的控制。这里说的细粒度指能够很好的对数据表中的列进行过滤,或者还包括对按钮等操作的控制。

先来看一个例子:

A公司有1000家客户,其中北京有500家,上海有500家,北京和上海都有专门的客户经理,他们只能看到自己区域的客户数据,而公司总部客户经理可以看到全部的客户信息。

在上边的例子中,如何来实现这个功能呢?

首先,要创建两个表:用户表、客户表,两个表中都保存一个地区列。

如果我们没有数据权限控制,就要创建三个页面(北京客户信息、上海客户信息、全部客户信息),然后建立三个角色(北京客户经理、上海客户经理、总部客户经理),每个角色设置对应的页面。如下图:

如果我们只有这三个功能,这个方法是可以被接受的,但是实际情况往往比此要复杂的多,而且还不得不考虑维护和升级的问题。

当然我们还可以进步一点,做一个页面,然后在页面中判断当前用户的数据权限。如下图:

客户经理打开客户信息页面,同时通过URL传递自己的区域信息,程序接收并判断不同的区域返回不同的客户信息。用这个方法,减少了两个页面的维护,有进步。但是如果要新增加一个新区域,比如广州,那么不得不添加一个if语句。

如果这种区域的变更一年都不会有一次,当然可以继续保持这种方法。但是对于频繁的更新,每次都得找开发人员修改代码,业务人员不痛快,开发人员也不痛快。

如果有更好的方式,比如,业务人员只需要在某个地方添加一个区域,然后分配一下这个区域的管理人员,然后这个管理人员就可以看到这个区域的信息了,这是大家都想要的。看下图:

我们可以在Session中保存客户经理的区域信息,然后当客户经理打开客户信息页面时,程序自动获取当前客户经理的区域信息,到数据库中查找相应的客户信息。

到目前,好像已经很好的解决了数据权限控制的问题,一般情况下我也是这么做的。

但是客户信息包含的不仅仅是客户的基本信息,还有联系记录、交易记录、合同记录等等,肯定超出我所能想到的。可以按照上边的方法,一个页面一个页面的写程序。大多数情况下,这也是可以接受的。

但是客户可能又有了新的需求,总部添加了一个大客户经理的职位,大客户经理只可以看到累计交易额在100W以上的客户信息。这时候怎么办呢?我们去到每一个页面里边添加这个新的查询条件,这时候开发人员开始感觉到有点不痛快了。

如何解决这个问题呢?

下一篇文章将提出解决方案。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯码,原文地址《细粒度数据权限控制的探索(1)

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论