0

我想使用选民来增强我的代码的安全性。我只希望某些用户能够删除项目集合。

这是我的例子:
我有一篇文章和与文章相关的标签。我希望文章的作者能够删除与该文章关联的标签(只有文章的作者可以这样做)

我正在考虑使用选民(检查用户是否是文章的作者),但我在互联网上找到的每个示例都显示从树枝或控制器调用的选民......而收集选项“允许-delete" symfony 从实体 Article 调用方法 removeTag($tag)。我也看不到我可以如何/在哪里打电话给选民。

4

1 回答 1

2

答案可能是这样的:

是的,你可以,在你想要的地方注入 service.container 并调用$this->securityContext->isGranted('delete', $tag);

但这意味着您需要在实体中注入服务,这是完全错误的。

另一种方法是在 preRemove 或 onFlush 事件的原则侦听器中执行此操作,这很酷但几乎是错误的,如果选民失败了怎么办?如果您抛出异常,这将破坏教义。如果没有用户,还会发生什么?原因是在监听器中你不能轻易地向用户返回反馈。

在更高的抽象级别上阻止实体删除是错误的,因为您可以在更好、更易于管理的地方进行操作,而不会在代码库的其他远程位置产生错误的风险。

试试这个:

  • 如果你使用 symfony 表单,你可以做以下两件事之一:
    • 使用表单约束作为服务,在此处注入安全上下文并进行验证,如果错误添加表单错误
    • 创建一个自定义表单类型作为服务,以集合为父,注入 security.context,最后使用 PRE_SET_DATA 上的表单侦听器检查是否删除了某些内容并检查当前用户是否允许使用 isGranted,如果检查失败添加表单错误
  • 如果您在单个操作(例如 api)中执行此操作,您只需要直接在您的操作或您的树枝中检查 isGranted
于 2015-04-15T11:56:14.373 回答