正如许多其他人所指出的那样,在这种情况下执行这样一个概念上简单的事情,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引用的?
答案 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);