我可以使用选民来删除集合中的项目

时间:2015-04-15 10:46:19

标签: symfony collections symfony-security

我想用选民来提高我的代码中的安全性。我只希望一些用户能够删除项目集合。

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

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

1 个答案:

答案 0 :(得分:2)

答案可能就是这样:

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

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

另一种方法是在preRemove或onFlush事件中的教义监听器内执行此操作,它很酷但几乎是错误的,如果选民失败你会怎么做?如果你抛出一个例外,这将破坏学说。如果没有用户会发生什么?原因是,在听众中,您无法轻松地向用户返回反馈。

阻止更高抽象级别的实体删除是错误的,因为您可以在更好,更易于管理的地方执行whitout风险,从而在代码库的其他远程位置创建错误。

而不是试试这个:

  • 如果您使用的是symfony表单,则可以执行以下两项操作之一:
    • 使用表单约束作为服务,在此处注入安全上下文并进行验证,如果错误则添加表单错误
    • 创建一个自定义formtype作为服务,其中collection为parent,注入security.context,最后在PRE_SET_DATA上使用表单侦听器检查是否删除了某些内容并检查当前用户是否允许使用isGranted,如果检查失败则添加a表格错误
  • 如果您在一次操作中执行此操作(例如api),则只需直接在您的操作或树枝中检查isGranted