Spring security 使用Spring安全ACL,如何保护传递给;“字符串”;钥匙

Spring security 使用Spring安全ACL,如何保护传递给;“字符串”;钥匙,spring-security,Spring Security,我了解如何将Spring安全注释应用于传递给域对象的方法。例如,以下工作: @PreAuthorize("hasPermission(#node, 'write')") void update(Node node); 然而,我有另一种方法,如下所示,我正在尝试确保: void delete(String nodeName) 由于域对象不可用于此方法,我不确定如何将“hasPermission”用于此方法。非常感谢您的帮助。我对定制ACL实现持开放态度,尽管在这种特殊情况下,任何这样的定制都应

我了解如何将Spring安全注释应用于传递给域对象的方法。例如,以下工作:

@PreAuthorize("hasPermission(#node, 'write')")
void update(Node node);
然而,我有另一种方法,如下所示,我正在尝试确保:

void delete(String nodeName)
由于域对象不可用于此方法,我不确定如何将“hasPermission”用于此方法。非常感谢您的帮助。我对定制ACL实现持开放态度,尽管在这种特殊情况下,任何这样的定制都应该不仅适用于“节点”对象,还适用于所有其他域对象

谢谢,

Raghu

在本例中,您是按名称删除,而不是按标识删除。这样做的方式是查找要删除的对象,然后在找到该对象后,将其传递给一个真正的删除方法,该方法遵循问题中第一个操作的模式。检查用户是否可以删除对象是在查找之后完成的。你会得到一个有点像这样的模式:

void delete(字符串名称){
Node=nodeFinder.lookup(名称);
if(node==null)
抛出新的NoSuchNodeException(名称);
underlyingEngine.delete(节点);
}

nodeFinder
和(特别是)underyingengine应该注入bean,以便Spring可以用所需的安全检查将它们封装起来。(
nodeFinder
检查是否允许用户知道命名节点,
underyingengine
应关注是否允许特定操作(本例中为删除操作)


请注意,您还可以通过使用将
@PreAuthorize
直接应用于
节点
(前提是您决定将它们制作成bean)。

这个答案是有意义的,即使我们案例中的“underlyingEngine”是提供接口“deleteByName()”的DAO本身。因此,它表现出与这里描述的完全相同的问题。
nodeFinder
underyingengine
实际上可能是同一个bean;它们是真正的rôles,而不是真实的物体。