我正在开发一个涉及Spring Security ACL的项目,我遇到了创建权限BasePermission.CREATE
。有人请解释这应该如何工作或它允许某人做什么?
据我所知,每个对象都有一个acl,每个acl都有很多ace,每个ace都有一个sid和一个权限。如果必须创建一个对象来创建它,你如何授予一个对象的权限?
答案 0 :(得分:8)
Spring安全性通过ObjectIdentity接口间接授予域对象的权限。
正如您所提到的,到目前为止,通常的情况是您首先创建或获取域对象,然后为域对象构造ObjectIdentityImpl
:
MyDomainObject secured = new MyDomainObject();
ObjectIdentity securedIdentity = new ObjectIdentityImpl(secured);
然后使用ObjectIdentity
实例使用spring安全框架检索ACL。
但是,这不是使用对象标识的唯一方法。您可以传递对不是实际业务对象的objectIdentity的引用,但是如果已创建它,则可以使用某种方法来识别它。
例如,假设我们想要保护文件。我们可以使用受保护的java.io.File
实例创建ObjectItentity。身份中的File
对象只是对文件的引用 - 它不是实际文件 - 文件甚至可能不存在,但我们有一个ObjectIdentity,然后我们可以推断安全性并获取ACL。
此模式可以应用于任何类型的域对象。创建一个DomainObjectPrototype
实现,根据保护域对象所需的域功能来描述域对象,但实际上并不需要对域对象的引用。您可以将此视为某些服务实际创建该域对象所需的详细信息。
答案 1 :(得分:0)
更广泛地思考有两种类型的权限:类和实例。对象创建是类权限 - 您有权创建新实例。当您尝试将其应用于单个实例时,它毫无意义。读取权限可以是。您可以拥有读取所有实例的权限,或者您只有权读取少数显式枚举的实例。
如果你有困惑想到经典的“惊喜生日派对电子邮件”问题。这是一个办公室电子邮件发送给每个人除了生日男孩计划惊喜生日派对。在这种情况下,您需要一个类CREATE权限来创建和发送电子邮件消息,并且每个人都具有读取该消息的类READ权限。但是,有一个人具有DENY READ实例权限,因此他一个人无法阅读该消息。