2

この問題が何度も議論されたことは知っていますが、いくつかの解決策を見つけたので、それが最善かつ最も効率的なアプローチであるかどうかはわかりません.

私の問題: ユーザー認証を処理するために fosuserbundle を使用していますが、ログインしているユーザーのログイン、パスワードのリセットなどのフォームが表示されないようにしたいと考えています。以下にいくつかのアプローチを示します。

  1. カーネル イベントに基づく最初のもの (既に実装されています) には、コード https://gist.github.com/walmen/871c13014b80c6a3d05dがあります。
  2. メソッドのオーバーロードに基づいて同僚が言及した2番目のアプローチ(ログインユーザーに表示されるべきではないロジックを持つ各メソッドのリスナーと重複コードを削除する)
  3. @RequireAnonymous などのカスタム アノテーションを記述します。

前に述べたように、私はすでに最初のアプローチを実装しましたが、それが最善かつ最も効率的なソリューションであるかどうかはわかりません (このリスナーはリクエストごとに呼び出されます - アプリケーションの負荷が重すぎませんか? リスナーの方法アプリケーションに影響しますか?)。

もちろん、2 番目のアプローチが最も簡単な方法ですが、コードの複製はあまり良いとは言えません。

最後のものが最適かもしれませんが、この例https://gist.github.com/cystbear/1391850を見ると、コントローラーの呼び出し中にイベントを呼び出すことにも問題があることがわかります。

適切な議論と説明を伴うアドバイスやその他のアイデアはありますか?

4

2 に答える 2

0

私の理解が正しければ、Symfony Standard に含まれているJMSSecurityExtraBundleで 3 番目のアプローチを使用できます。

認証されたユーザーから除外したいアクションでは、次のように実行できます。

/**
 * @Secure(roles="IS_AUTHENTICATED_ANONYMOUSLY")
 */
public function fooAction()
{
    // stuff...
}

これにより、特定のパスを要求しているユーザーが認証されないことが保証されます。

于 2013-03-09T15:12:03.480 に答える
0

@Ramonは、認証されたユーザーであっても、すべてのユーザーがロール IS_AUTHENTICATED_ANONYMOUSLY を持っているため、そうではありません。

さらに、「アクセスが拒否されました」などの例外をスローしたくはありませんが、リダイレクトのおかげでそれらのページを「非表示」にしたいと考えています。

このhttps://github.com/FriendsOfSymfony/FOSUserBundle/issues/996#issuecomment-14812806についてどう思いますか?

于 2013-03-12T23:36:40.887 に答える