将POST请求发送到安全操作

Dru*_*les 9 php post symfony1 sfguard symfony-1.4

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

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

如果没有登录,则不应向用户显示表单,但用户可能可以在表单仍然打开的情况下注销.所以我要求保持界面的防水和无错误.

这是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]
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

Ger*_*rry 6

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

从BasesfGuardActions.class.php中的代码:

if ($request->isMethod('post'))
{
  $this->form->bind($request->getParameter('signin'));
Run Code Online (Sandbox Code Playgroud)

我个人并不喜欢在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();
  }

}
Run Code Online (Sandbox Code Playgroud)

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

security:
  class: mySecurityFilter
Run Code Online (Sandbox Code Playgroud)