0

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

@PreAuthorize("hasPermission(#node, 'write')")
void update(Node node);

但是,我有另一种方法如下所示,我正在尝试保护:

void delete(String nodeName)

由于此方法无法使用域对象,因此我不确定如何将“hasPermission”与此方法一起使用。任何帮助是极大的赞赏。我对自定义 ACL 实现持开放态度,尽管在这种特殊情况下,任何此类自定义不仅适用于“节点”对象,还适用于所有其他域对象。

谢谢,
拉古

4

1 回答 1

0

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

void delete(String name) {
    Node node = nodeFinder.lookup(name);
    if (node == null)
        throw new NoSuchNodeException(name);
    underlyingEngine.delete(node);
}

nodeFinderand (尤其是)应该被注入 bean ,underlyingEngine以便 Spring 可以用所需的安全检查来包装它们。(nodeFinder检查应该是是否允许用户知道命名节点,underlyingEngine应该关注是否允许特定的操作——在这种情况下是删除。)

请注意,您也可以通过在表达式中使用@PreAuthorize直接将Node#this

于 2012-11-06T13:35:54.953 回答