0

我想就设计基于计数的访问控制获得一些建议。例如,我想根据客户的帐户限制客户可以在我的系统中创建的用户数量。因此,默认情况下,客户可以创建 2 个用户,但如果升级他们的帐户,他们可以创建 5 个用户,依此类推。在类似的基础上,我还需要限制更多功能。

该应用程序遵循通用模型,因此公开的每个功能都有一个后备表,并且我们有一个处理该表上的 CRUD 操作的类。此外,该应用程序在多个节点上运行并具有分布式缓存。

我为实现这一点而采取的方法如下 - 我有一个新表,它捕获要控制的功能和允许的限制(每个客户存储)。- 我截取所有表的创建方法并检查相关表是否需要应用访问控制。如果是这样,我会获取已创建实体的数量并与限制进行比较以决定是否应该允许创建。- 在并发请求的情况下,我正在使用数据库来处理同步。因此,在调用 create 方法后,我使用以下 where 子句更新表

其中 (count_column + 1) = #countInMemory#

. 即仅当存储在 DB 中的值 + 1 = 内存中的值时,更新才会成功。这将确保即使两个线程同时尝试创建,也只有其中一个能够成功更新。成功更新的线程获胜,另一个回滚。这样我就不需要同步应用程序中的任何代码。

我想知道是否有任何其他/更好的方法来做到这一点。我的应用程序在 Oracle 和 MySQL 数据库上运行。

谢谢您的帮助。

4

1 回答 1

0

当你回滚时,你是重试(在获取新的用户数之后)还是失败?我推荐前者,假设新获取的用户数将允许另一个用户。

我最近处理了一个类似的系统,需要考虑一些事项:您是否希望 CustomerA 能够将其用户转移到 CustomerB?(假设客户不是独立的,例如在我们的系统中,客户 A 可能是 IT 经理,而客户 B 可能是为同一家公司工作的会计经理,当客户 A 的一名员工转到会计部门时,他希望客户 B 的员工能够反映这一点帐户。)当客户被删除时,客户的用户会发生什么?(在我们的例子中,另一个客户/经理需要采用它们,否则它们将被删除。)您如何将客户的用户限制存储在单独的表中(例如,客户的类型为“Level2”,客户类型为表中说“Level2”客户可以创建 5 个用户),或者在客户'type说他们可以拥有 5 个用户的override列,以及说他们可以拥有额外 3 个用户的列)?

但这无关紧要。您的数据库同步很好。

于 2013-04-17T16:04:34.550 回答