2013-10-10 3 views
13

私はWebアプリケーション用のSpring SecurityでSpring-MVCを使用しています。ユーザー登録ページと個人ユーザーパネルが含まれています。私はそれは、次のURLパターンと、現在設定している:MVCインターセプター対春のセキュリティフィルター対何か...?

  • whatever/myapp/loginユーザログ開始登録
  • whatever/myapp/register?step=1
  • whatever/myapp/account/**プライベートエリアビュー(ページ)後、登録プロセスの完全ながら
  • whatever/myapp/pendingビューが示され
  • whatever/myapp/blockedアカウントブロックビュー
  • whatever/myapp/register/retry登録が失敗した場合、a基本的に

を再試行LLOW、以下これらのURLは、ユーザー認証を必要とすべきである、すなわち必要-ログイン:は

  • whatever/myapp/pending(このページはにリダイレクトするように設定されたタイマを持ってい

    • whatever/myapp/account/**(プライベートエリアページ) /アカウント/ホーム)
    • whatever/myapp/register/retry

    これは交流に非常に簡単ですSpringのセキュリティを使用してhieveします。ただし、Springセキュリティによるユーザー認証に関係なく、ユーザーの現在のアカウント状況(自分のDBに格納されている)に応じて、プライベートエリアページにアクセスできるかどうかを確認する必要があります。

    具体的には、ユーザーがプライベートエリア(/account/**)にアクセスしようとすると、状況に応じて適切なビュー(適切なページにリダイレクトされている)が表示されます。私はこれらのステータスが定義されています:

    • suspended - 関連ビュー
    • enabledを保留に - フルアクセスに
    • disabledを許可する - ここ
    • retry_allowed関係ありません - ビュー
    • blockedに再試行に関する - に関し、アカウントブロックビュー

    現在、私はMVCインターセプターの設定を/account/**にして、ユーザーの状態をチェックし、適切なページにリダイレクトしますが、これは複数のコントローラー呼び出しのような奇妙な動作に直面しているため、 ..また、私は返信することをかなり確信していませんtrue/falsepreHandle()方法の中に。インターセプタからのコードスニペットは次のとおりです。

    です。

    これは有効なアプローチですか?代替案はありますか?

  • 答えて

    21

    すべてのオプションは有効です。これは、必要な抽象化のレベルによって異なります。Filter

    、あなただけのHttpServletRequestHttpServletResponseオブジェクトへのアクセス権を持っているので、あなたは非常にServlet APIに連結されています。レンダリングするビューを返すか、ResponseEntityのような偉大なSpringの機能にアクセスすることはできません。

    HandlerInterceptorでは、もう一度同じです。 ModelAndViewにアクセスできないpreHandle()で直接リダイレクトや処理をリクエストしたり、postHandle()にチェックインするフラグを設定したりできます。 ModelAndViewにアクセスできますが、その他のSpring MVCの機能にはアクセスできません。

    春のセキュリティは良い選択ですが、私はあまり気に入らない設定がたくさんあることがわかります。

    私が一番好きなのは、AOPを使うことです(これはSpring SecurityやShiroでも可能です)。 @Privateのような注釈を作成し、@Controllerハンドラメソッドに注釈を付けます。 AOPを使用して、これらのメソッドに助言します。アドバイスは、基本的に、いくつかのセッションまたはフラグ(認可されているかどうか)を要求する属性をチェックします。許可されている場合はハンドラーメソッドの実行を続け、そうでない場合はUnauthorizedException(またはこれに類する)をスローします。また、応答の生成方法を完全に制御できる場合は、@ExceptionHandlerを宣言します。ModelAndView(およびそれに関連する)、ResponseEntity、ハンドラに@ResponseBodyという注釈を付けて直接応答を書くなど、あなたがそれを望むなら、はるかに多くのコントロールを持っています。

    関連する問題