我有一个操作,它接受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]
用于提交请求的表单如下:
<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>
答案 0 :(得分:6)
这是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
答案 1 :(得分:0)
这可能是因为您将auth的代码放在同一个操作中(最好通过检查请求是否发布)。
但是,您可以将一个动作分为两个动作。一个用于显示登录表单,另一个用于验证用户的登录数据。并将您的secure_action设置为仅显示登录表单的操作。