避免在Symfony中“用户交叉访问”

时间:2012-05-20 14:51:30

标签: symfony-1.4

我目前正在开发一个基于Symfony 1.4的项目。我使用sfDoctrineGuardPlugin来验证我的两种用户:用户和管理员。对于模块中的每个模块和每个操作,我使用凭据来防止未经授权的操作执行。

但是我遇到了一个问题:例如,如果用户想要编辑项目,则URL将类似于 frontend.php / project / edit / id / 1 。在这里,我们假设项目#1属于他。现在,让我们假设项目#2不属于他。如果他键入URL frontend.php / project / edit / id / 2 ,他将可以访问编辑表单,并且能够编辑不属于他的项目。

我该如何防止这种行为?

我希望在显示编辑表单之前避免验证每个可编辑模型的所有权......但我可以采取不同的方式吗?

您是否有任何良好做法或建议来阻止此行为?

非常感谢!

1 个答案:

答案 0 :(得分:1)

由于您必须检查项目以了解当前用户是否可以编辑项目,因此我认为除了在编辑之前验证之外,您还有其他方法。你为什么不想这样做?

此检查可在preExcute函数内完成:

public function preExecute()
{
  $request = $this->getRequest()
  if ($request->hasParameter('id'))
  {
    $project = Doctrine_Core::getTable('Project')->find($request->getParameter('id'));
    $user_id = $this->getUser()->getGuardUser()->getId();

    $this->forward404If(
      $project->getUserId() !== $user_id, 
      'User #'.$user_id.' is not allowed to edit project #'.$project->getId()
    );
  }
}