9

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

2 に答える 2

6

サインインアクションがPOSTリクエストをチェックし、その場合はフォームをバインドするため、これはsfGuardの欠点です。

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
于 2011-08-31T08:03:51.113 に答える
0

これはおそらく、ログインデータを認証するコードを同じアクションに入れたためです(おそらく、リクエストが投稿されているかどうかを確認することによって)。

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

于 2011-08-31T06:53:49.350 に答える