2011-12-29 3 views
2

私はRESTfull APIであり、より標準的なWebページの一部である私のWebアプリケーションの一部を持っています。Spring Security複数のfilterChainProxyマッピング/フィルタ、カスタムフィルタJson出力

私は、EntryPoint、SuccessHandler、FailureHandlerなどのカスタムフィルタを使用してREST部分を作成したいと考えています。この部分は/ rest/**マッピング内にあります。

その他のすべてのフィルタは、より一般的なフィルタを必要とし、/ **でマッピングされます。

問題は、異なるマッピングフィルタでfilterChainProxyを定義する簡単な方法を見つけることです。

今、このソリューションは動作しません:

<!-- Normal web app --> 
<http auto-config="true" use-expressions="true" authentication-manager-ref="authenticationManager"> 
    <form-login/> 
    <logout/> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
</http> 

<!-- Configure RESTfull services --> 
<http use-expressions="true" authentication-manager-ref="authenticationManager" entry-point-ref="restAuthenticationEntryPoint" > 
    <form-login authentication-success-handler-ref="restAuthenticationSuccessHandler" login-page="/rest/login" username-parameter="username" password-parameter="password" /> 
    <logout logout-url="/rest/logout" /> 
    <intercept-url pattern="/rest/**" method="GET" access="hasRole('ROLE_USER')" /> 
    <intercept-url pattern="/rest/**" method="POST" access="hasRole('ROLE_ADMIN')" /> 
    <intercept-url pattern="/rest/**" method="PUT" access="hasRole('ROLE_ADMIN')" /> 
    <intercept-url pattern="/rest/**" method="DELETE" access="hasRole('ROLE_ADMIN')" /> 
</http> 

それは、と文句を言う:univseral試合は他のパターンの前にいます。

定義でfilterChainProxyを定義することなく、そのようなことを定義する方法はありますか? httpバージョンは、私が手動でUsernamePasswordAuthenticationFilterなどを設定しなければならないので、構成の量を減らすのにかなり役立ちます。

次の問題はもっと簡単です。私はフォームログイン認証の後に応答する必要があります。 JSONオブジェクト。

これまでのところ、私はSuccessHandler(実際にはリダイレクト部分のないSimpleUrlAuthenticationSuccessHandlerのバージョン)を実装しました。

JSON出力を書き込むにはどうすればよいですか?

HTTP 200 OK 

と::

{"success":true,"customer {"email":"[email protected]","session_id":"b83a41dfaca6785399f00837888886e646ff9088"}} 

とFailureHandlerと同様のこと

私はこのような何かを持っている必要があります。それはかなりシンプルでなければならず、確かに非常に基本的なことですが、どうしていますか?非常に単純なRESTクライアントが理解できない301リダイレクトステータスがあるため、カスタムコントローラへのリダイレクトは解決策ではありません。

少なくとも、httpヘッダーとボディーは一切持たないことを望みます。

ありがとうございました!

+0

1つのApplicationContextに2つのドリフントインターフェイス(WWWとREST)のハンドリングを配置する理由は何ですか? 2つのコンテキスト/セッションの共有はありますか? WWWへのログインは、RESTへのログインも意味しますか?その場合は、なぜログインアクションを分離するのですか?いいえの場合は、なぜ一緒に置くのですか?単一の基礎となるサービス層に異なるインターフェースを提供する別個のアプリケーションではないでしょうか? – Roadrunner

+0

通常のWebアプリケーションの中にREST部分があるようなものです。私は別の認証プロセスを望んでいない、私はちょうど他のフィルタが欲しい。 RESTの部分は認証がないときにエラーを表示するだけですが、Webページではユーザーをログインページにリダイレクトする必要があります。 – adreide

答えて

1

もしあなたがSpring Security 3.1にアップグレードできるなら、それはsupports multiple chains using namespace configurationです。

+0

ありがとうございます。詳細についてはhttp://static.springsource.org/spring-security/site/docs/3.1.x/reference/security-filter-chain.html#filter-chains-with-nsを参照してください。私はhttp名前空間の中でパターン属性を使用しなければなりませんでした。 – adreide

関連する問題