1

对于每篇文章,都会显示评论列表。我希望用户能够编辑他们自己的评论(并且只有他们自己的评论)。我想知道使用方法 2 是否可以,或者是否存在安全漏洞?

方法一

到目前为止,我使用表单中的 security.context 来检查当前评论作者是否是 current_user。如果是,那么我可以在我的表单中添加一个带有 comment.text 的文本区域,以便用户可以编辑其评论。(但我的表单因此必须定义为服务,以便我可以注入 security.context)

在我的表单中(定义为服务,以便我可以注入 security.context)

 $current_user = $this->Securitycontext->getToken()->getUser();
 // I add the textarea to allow edit of the comment only if the user is the author of the comment.
 if($current_user == $comment->getAuthor())
 {
      $form->add('comment.text', 'textarea');
 }

方法_2

我尝试了一些不同的东西,它似乎工作正常(此外,我不必将我的表单定义为服务,因为我没有在我的表单中使用 security.context。)

我为我的实体评论创建了一个 EditAutorisation 属性。从控制器,我检查 current_user 是否是评论的作者。如果是,我将 EditAutorisation 设置为 true。

 if($this->getUser() = $comment->getAuthor()){
     $comment->setEditAutorisation('true');
 }

然后在我的表单中,我只需检索 EditAutorisation 的值

 if($comment->getEditAutorisation() )
 {
      $form->add('comment.text', 'textarea');
 }

PS:在这两种情况下,我都在表单中使用 EventListener PRE_SET_DATA 来访问对象 $comment

我不太喜欢methode2,因为我不必将它定义为服务。但是因为我可以在控制器中进行测试,并在 PHP 中的 FORM 中轻松使用测试结果(使用 eventListener 获取 $comment->getEditAutorisation())和 TWIG(使用 {{ comment.EditAutorisation }})

4

1 回答 1

0

我不喜欢方法 2,因为每次使用表单时都需要重复安全检查。可能重复的代码。如果你忘记了会发生什么?

但是你的方法也需要一些工作。

看看安全选民:https ://symfony.com/doc/current/cookbook/security/voters_data_permission.html

代替:

$current_user = $this->Securitycontext->getToken()->getUser();
if($current_user == $comment->getAuthor()) {
  $form->add('comment.text', 'textarea');
}

你将会拥有:

if ($authChecker->isGranted('edit', $comment)) {
  $form->add('comment.text', 'textarea');
}

例如,通过实施选民,您可以轻松地允许管理员用户编辑任何帖子的评论。或者也许有特定类别帖子的版主。

选民是你的朋友。去看一下。

于 2015-07-08T18:19:10.707 回答