2017-04-25 86 views
0

我试图在Spring安全性中推出自己的自定义ACL系统,该系统比默认的ACL系统更适合我的项目。我的问题是这样的:Spring Security的ACL(访问控制列表)如何处理每个OBJECT_IDENTITY具有多个权限的主体?

Spring Security提供的默认ACL实现如何处理每个域对象具有多个权限(OBJECT_IDENTITY)的单个主体对象(SID),而不会混淆数据库?

文档状态:"ACL_ENTRY stores the individual permissions assigned to each recipient. Columns include a foreign key to the ACL_OBJECT_IDENTITY, the recipient (ie a foreign key to ACL_SID), whether we'll be auditing or not, and the integer bit mask that represents the actual permission being granted or denied. We have a single row for every recipient that receives a permission to work with a domain object."

所以ACL_ENTRY基本上是用户具有权限的单个域对象的单个主体用户之间的连接表,和。

好。然而;在控制器层上,可以在单个对象上执行多个CRUD方法。如果一个用户有权更新和删除一个对象,但是另一个用户只有创建和读取对象的权限(例如)。默认的Spring ACL系统是否在数据库中存储一个EACH和每个权限的主体用户和域对象之间的权限?例如,Joe有权读取此对象。行+ = 1. Joe也有权写入此对象。行再次= 1,依此类推。

如果它能以这种方式实现我的自定义卷展栏,那么因为我担心在数据库中为每个对象,每个主体添加多个权限(您可以看到如果一个主体读取,写入,并且更新每个对象的权限,即每个用户三行,获得300个用户,这就是900行,你可以看到这是一个指数问题)。

如果不是那么这是如何工作的?谢谢。

回答

0

是否默认的ACL春季系统存储在数据库中的一排 每一个主体用户和域 对象之间的所有权限?

是的。

另一方面,权限只需要一位(开或关),并且Permission接口甚至有一个getMask()方法可将多个权限合并为一个整数,因此每个sid /用户和域对象。 但是,Spring Security中的内置ACL权限评估器可能会令人困惑地而不是处理这样的位掩码,但需要为授予的每个权限分别设置一行。 编辑:这个限制在问题报告SEC-2342中有描述。

关于您对许多行存储权限的担心:安全标识(sid)不需要是单个用户,它也可以是一个组。如果有许多用户,请将用户分配到组并设置组的权限。

+0

非常感谢你的这个信息。我想深入了解一些你的观点。 1)如此真或假?:内置的评估程序无法处理这种内置的蒙版,并且需要为每个许可单独划分一行。因此,在所有实际情况中,使用默认的ACL仍然需要为每个单独的权限创建一个新的单行,即在事件1上为用户1的读取权限进行行操作。在事件1上为用户1写入权限的新行等。? –

+1

@TylerDurden真(截至上次检查)。 – holmis83

+0

和2)组在这里与'角色'不同吗?在我的自定义实现中,我正在考虑执行类似以下操作的操作:而不是读取,写入,更新等,我将拥有更像角色的自定义“权限”:dog_owner和vet_medic。我的连接表将一个域对象与一个主体用户结合在一起,并包含上述“权限”之一。这些'权限'本质上会带有诸如更新,读取,删除等配额。现在,在控制器方法检查中,@preAuthorization表达式将检查dog_owner或vet_medic。 I.E.更新需要vet_medic –

相关问题