繁体   English   中英

向安全操作发送 POST 请求

[英]Sending POST Request to Secured Action

我有一个动作,需要 sfGuard 保护的 POST 数据。 这意味着如果用户没有登录,POST 数据将被发送到登录表单。 通常,这不是问题,用户继续登录,并且必须再次提交数据。

不幸的是,登录表单似乎正在使用 POST 数据,就好像它是与表单本身一起提交的。 这意味着它抱怨缺少必需的用户名和密码字段,并且抱怨缺少 CSRF 令牌。 这最后一个问题不 go 了,提交表单后,意味着用户无论如何无法登录。

如果未登录,则不应向用户显示表单,但用户可能会在表单仍处于打开状态时注销。 因此,我要求保持界面防水且无错误。

这是 sfGuard 的缺点,可以避免,还是我做错了什么?

为了澄清,路线如下所示:

add_subgroup:
  url:      /group/:id/add
  class:    sfPropelRoute
  options:
    model:  Group
    type:   object
  param:    { module: subgroups, action: create }
  requirements:
    group_id: \d+
    sf_method: [post]

用于提交请求的表格如下:

<form action="<?php echo url_for('add_subgroup', $group) ?>" method="post">
  <input type="hidden" name="group_id" value="<?php echo $group->getId() ?>" />
  <input type="text" name="subgroup_id" />
  <input type="submit" class="button" value="Add" />
</form>

这是 sfGuard 的一个缺点,因为登录操作会检查 POST 请求,如果是则绑定表单。

从 BasesfGuardActions.class.php 中的代码:

if ($request->isMethod('post'))
{
  $this->form->bind($request->getParameter('signin'));

我个人不太喜欢在 symfony 中的动作之间进行转发,就像在这种情况下一样,我认为重定向比转发更合适。 这也解决了您的问题,因为这将导致新的 GET 请求。 您可以通过扩展 sfGuardBasicSecurityFilter 来完成此行为。

class mySecurityFilter extends sfGuardBasicSecurityFilter
{

  protected function forwardToLoginAction()
  {
    $context = $this->getContext();
    // If you want to redirect back to the original URI (note: original POST data will be lost)
    $context->getUser()->setReferer($context->getRequest()->getUri());
    $url = sfConfig::get('sf_login_module') . '/' . sfConfig::get('sf_login_action');
    $context->getController()->redirect($url);
    throw new sfStopException();
  }

}

现在在 app/myapp/config/filters.yml

security:
  class: mySecurityFilter

这可能是因为您将验证登录数据的代码放在同一个操作中(可能是通过检查请求是否已发布)。

但是,您可以将一个动作分为两个动作。 一个用于显示登录表单,另一个用于验证用户的登录数据。 并将您的 secure_action 设置为仅显示登录表单的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM