不使用Spring ACL,实现基于" creator"的方法级安全检查。一个实体

时间:2017-04-24 19:01:10

标签: java spring spring-mvc spring-security acl

正如许多其他人所指出的那样,在这种情况下执行这样一个概念上简单的事情,ACL似乎有些过分。

我正在寻找Spring Security中以下场景的简单实现:

我在控制器中有一个方法来处理事件实体的删除请求。我需要@PreAuthorize表达式,它将检查以确保提交请求的用户的ID与请求所有者的ID相匹配。也许通过Event.getOwner()。getId()方法。

这看起来怎么样?感谢。

我正在想类似的事情。事件控制器中的以下方法:

 @PreAuthorize("#event.getOwner().getId() == authentication.id")
 public void delete(@PathVariable("id") final Long id, @RequestBody final Event event) {
    repo.delete(id, event);
}

如果这是正确的用法,#event来自何处?换句话说,'#'是什么意思?我问,因为此时我们在控制器中,所以,哪个事件是#event引用的?

1 个答案:

答案 0 :(得分:1)

你的想法不安全。它要求包括所有者在内的事件信息作为请求主体在删除请求中发送。有了这个,客户端可以将所有者欺骗为当前用户而不是实际所有者。

假设id是事件的唯一ID,我建议将以下内容作为最小解决方案:

@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
@PreAuthorize("@repo.getOwnerOfEvent(#id) == authentication.name")
public void delete(@PathVariable("id") final Long id) {
    repo.deleteEvent(id);
}

上面的代码片段需要一个名为" repo"包含方法:

/**
 * Returns the owner username of the event with the specified id.
 */
String getOwnerOfEvent(long id);