Отправка POST-запроса к защищенному действию - PullRequest
9 голосов
/ 17 августа 2011

У меня есть действие, которое принимает данные POST, защищенные sfGuard.Это означает, что если пользователь не вошел в систему, данные 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]

Форма, используемая для отправки запроса, выглядит следующим образом:

<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>

Ответы [ 2 ]

6 голосов
/ 31 августа 2011

Это недостаток 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
0 голосов
/ 31 августа 2011

Вероятно, это потому, что вы помещаете код аутентификации данных для входа в одно и то же действие (возможно, проверяя, является ли запрос отправленным).

Однако Вы можете разделить одно действие на два действия.Один для отображения формы входа в систему, а другой для аутентификации данных для входа пользователя.И установите для вашей secure_action действие, которое просто показывает форму входа.

...