2011-08-17 16 views
9

sfGuardによって保護されたPOSTデータを取るアクションがあります。つまり、ユーザーがログインしていない場合は、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

あなたはログインフォームまたは何をしようとしている、より具体的なことができますか? – Henry

+0

保護されたアクションを呼び出そうとしています。ユーザーがログインしていない場合は、既存のログインフォームに移動します。アクションがPOSTデータを必要とするため、このPOSTデータはフォームに干渉しています。あなたは私がより具体的にすべきことをより具体的にすることができますか? – Druckles

+0

ユーザーがログインしていない場合はどう扱いますか?ヘッダーのリダイレクトを発行すると、POSTデータはクリアされます。代わりにそれを含めると、POSTデータが表示されます。 –

答えて

6

これはsfGuardの欠点です。これは、signinアクションが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に/設定/ filteres.ymlの

security: 
    class: mySecurityFilter 
0

ログイン認証のコードを置くためと考えられます同じアクション内のデータ(リクエストがポストかどうかを確認することによって確かに)。

ただし、1つのアクションを2つのアクションに分けることができます。 1つはログインフォームを表示するもので、もう1つはユーザーのログインデータを認証するためのものです。 secure_actionをログインフォームを表示するアクションに設定します。

関連する問題