设计基于计数的访问控制

时间:2013-04-17 15:30:38

标签: java algorithm architecture

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

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

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

更新表
  

其中(count_column + 1)= #countInMemory#

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

我想知道是否还有其他/更好的方法。我的应用程序在Oracle和MySQL DB上运行。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

当您回滚时,是否重试(获取新用户数后)或者您是否失败?我推荐前者,假设新获取的用户数将允许其他用户。

我最近处理过类似的系统,还有一些事情需要考虑:您是否希望CustomerA能够将用户转移到CustomerB? (这假设客户不是独立的,例如在我们的系统中,CustomerA可能是IT经理,而CustomerB可能是为同一家公司工作的会计经理,当CustomerA的一名员工转向会计时,他希望CustomerB能够反映这一点。帐户。)删除客户后,客户的用户会发生什么? (在我们的例子中,另一个客户/经理需要采用它们,否则它们将被删除。)如何存储客户的用户限制 - 在单独的表中(例如,客户具有“Level2”类型和客户类型)表说“Level2”客户可以创建5个用户),或者在客户的行中(这更容易出错,但也允许每个客户覆盖他们的最大用户数)或组合(客户有{ {1}}列表示他们可以拥有5个用户,而type列表示他们可以拥有额外的3个用户)?

但这不是重点。您的数据库同步很好。

相关问题