避免在使用Symfony的表单中使用security.context

时间:2015-07-08 15:30:59

标签: forms symfony security-context

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

METHODE 1

到目前为止,我使用表单中的security.context来检查当前评论作者是否是current_user。如果是,那么我可以在我的表单中添加带有comment.text的textarea,以便用户可以编辑其评论。 (但我的表单必须定义为服务,以便我可以注入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');
 }

METHODE_2

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

我为我的实体评论创建了一个EditAutorisation Attribut。从控制器,我检查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来访问objet $ comment

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

1 个答案:

答案 0 :(得分: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');
}

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

选民是你的朋友。检查一下。