对于每篇文章,都会显示评论列表。我希望用户能够编辑他们自己的评论(并且只有他们自己的评论)。 我想知道使用方法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>的
答案 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');
}
通过实施投票人,您可以轻松地允许管理员用户编辑任何帖子的评论。或者可能有特定类别的帖子的版主。
选民是你的朋友。检查一下。