Отправка почтового запроса на Защищенное действие
У меня есть действие, которое принимает данные, защищенные sfGuard. Это означает, что если пользователь не вошел в систему, данные записи будут отправлены в форму входа в систему. Обычно это не проблема, пользователь продолжает входить в систему и должен снова отправлять данные.
К сожалению, форма входа в систему, похоже, использует данные 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 answers
Это недостаток 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();
}
}
Теперь в приложении/myapp/config/filters.yml
security:
class: mySecurityFilter
Вероятно, это связано с тем, что вы вводите код аутентификации данных для входа в систему в одно и то же действие (вероятно, проверяя, отправлен ли запрос).
Однако вы могли бы разделить одно действие на два действия. Один для отображения формы входа в систему, а другой - для аутентификации данных входа пользователя. И установите свой secure_action на действие, которое просто показывает форму входа в систему.