有人可以解释一下Spring Security BasePermission.Create吗?

我正在开发一个涉及Spring Security ACL的项目,我遇到了创建权限BasePermission.CREATE 。 有人请解释这应该如何工作或它允许某人做什么?

我的理解是每个对象都有一个acl,每个acl都有很多ace,每个ace都有一个sid和一个权限。 如果必须创建一个对象来创建它,您如何授予对象创建它的权限?

Spring安全性通过ObjectIdentity接口间接授予域对象的权限。

正如您所提到的,到目前为止,通常的情况是您首先创建或获取域对象,然后为域对象构造ObjectIdentityImpl

 MyDomainObject secured = new MyDomainObject(); ObjectIdentity securedIdentity = new ObjectIdentityImpl(secured); 

然后使用ObjectIdentity实例使用spring安全框架检索ACL。

但是,这不是使用对象标识的唯一方法。 您可以传递对不是实际业务对象的objectIdentity的引用,但是如果已创建,则可以使用某种方法来标识它。

例如,想象一下我们想要保护文件。 我们可以使用受保护的java.io.File实例创建ObjectItentity。 身份中的File对象只是对文件的引用 – 它不是实际文件 – 文件可能甚至不存在,但我们有一个ObjectIdentity,然后我们可以推断安全性并获取ACL。

此模式可以应用于任何类型的域对象。 创建一个DomainObjectPrototype实现,该实现根据保护域对象所需的域function来描述域对象,但实际上并不需要对域对象的引用。 您可以将此视为某些服务实际创建该域对象所需的详细信息。

PS:让我承认我从未使用过弹簧安全性,但看了一个例子后,我的设计模式似乎很清楚。

编辑:我已经更新了这个以希望更清楚 – 没有必要创建ObjectIdentity的实现,因为我原来写的。

更广泛地思考有两种类型的权限:类和实例。 对象创建是类权限 – 您有权创建新实例。 当您尝试将其应用于单个实例时,它毫无意义。 读取权限可以是。 您可以拥有读取所有实例的权限,或者您可能只有权读取少数显式枚举的实例。

如果你有困惑想到经典的“惊喜生日派对电子邮件”问题。 这是一个办公室电子邮件发送给每个人除了生日男孩计划惊喜生日派对。 在这种情况下,您需要一个类CREATE权限来创建和发送电子邮件消息,并且每个人都具有读取该消息的类READ权限。 但是,有一个人具有DENY READ实例权限,因此他无法单独阅读该消息。