繁体   English   中英

设计基于计数的访问控制

[英]Designing a count based access control

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

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

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

其中(count_column + 1)=#countInMemory#

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

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

谢谢您的帮助。

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

我最近处理过类似的系统,需要考虑以下几点:您是否希望CustomerA能够将其用户转移到CustomerB? (这假设客户不是独立的,例如在我们的系统中,客户A可能是IT经理,客户B可能是在同一家公司工作的会计经理,并且当CustomerA的一名雇员转向会计时,他希望这可以由CustomerB的员工反映出来。帐户。)删除客户后,客户的用户会怎样? (在我们的例子中,另一个客户/经理将需要采用它们,否则将删除它们。)如何存储客户的用户限制-在单独的表中(例如,客户的类型为“ Level2”,而客户类型表格说“ Level2”客户可以创建5个用户),或在客户行中(这更容易出错,但也允许每个客户覆盖其最大用户数),或组合(客户有一个type列中说他们可以拥有5个用户,而override列中说他们可以拥有另外3个用户)?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM