设计基于计数的访问控制



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

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

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

更新表

where (count_column + 1) = #countInMemory#

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

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

谢谢你的帮助

回滚时,是重试(在获取新的用户计数之后)还是失败?我建议使用前者,假设新获取的用户计数允许另一个用户。

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

但这不是重点。

最新更新