2012-03-24 5 views
4

春のセキュリティでDaoAuthenticationProvider内からHttpServletRequestオブジェクトにアクセスする必要があります。DaoAuthenticationProviderでHttpServletRequestにアクセスすると、Springセキュリティで認証されます

セキュリティコンポーネントはDaoAuthenticationProviderを拡張し、authenticateメソッドをオーバーライドしてカスタム認証/検証を実行します。リクエストURLに含まれるユーザーのIPアドレスをクエリ文字列パラメータ(例:http://domain.com/context?ip=192.168.0.1)として検証するには、追加のチェックが必要です。

私が試みている現在のアプローチは、RequestContextHolderスレッドローカルを使用し、私のカスタムでhttpリクエストを取得することですDAOAuthenticationProvider。私はここに、春のフォーラムで読ん

他のいくつかのソリューションはAuthenticationDetailsSourcecustom-filterの使用とIが原因のセキュリティを春に新しいことに理解していない他のステップを注入することをお勧めているようです。

認証を実行するために同じセキュリティコンポーネントを使用するさまざまなWebアプリケーションがあります。

誰かが正しい方向で私を指摘したり、以前に実装された方法を教えてもらえますか?

+0

どのバージョンのSpring Securityを使用していますか? – sourcedelica

+0

Springセキュリティ3.0.4。私がRequestContextHolderを認証中に使用すると、Spring Securityで取得したものと同じHTTP要求があるか、RequestContextHolderにhttp要求の別のインスタンスがあり、認証トークンで使用されているものが異なるという面白い結果につながりますか? –

答えて

1

web.xmlにSpringのRequestContextFilterを追加できます。このようにして、属性はすべての要求に対して現在のスレッドに保存されます。あなたはRequestContextHolderを使用することができます

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); 
HttpServletRequest request = attributes.getRequest(); 
+0

これは、OPはすでに何をしているのですか? –

+0

@LukeTaylor:申し訳ありませんが、OPは何ですか? – sinuhepop

+0

[OP](http://en.wiktionary.org/wiki/OP)==この場合のAnkur :-) –

3

と春のセキュリティは、通常、着信要求をラップしますけれども、それは効果的に、同​​じ要求が含まれているので、あなたが置くかどうかに応じて異なる基準を取得することがあります。その後、元のHtttpServletRequestを得ることができますRequestContextFilterをSpring Securityチェーンの前または後に追加します(RequestContextHolderから返された値をアプリケーションコントローラ内の要求と比較することで、これを簡単に確認できます)。

あなたが言及したように、カスタムAuthenticationDetailsを注入することも比較的容易である:

package com.mycompany; 

public class MyWebAuthenticationDetailsSource implements AuthenticationDetailsSource { 
    public Object buildDetails(Object context) { 
     return ((HttpServletRequest)context).getParameter("ip"); 
    } 
} 

その後

<bean id="ads" class="com.mycompany.MyWebAuthenticationDetailsSource /> 

<bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationDetailsSource" ref="ads" /> 
    <property name="authenticationManager" ref="authenticationmanager" /> 
</bean> 

を使用して、リファレンスマニュアルに記載されたカスタムフィルタとしてこれを追加します。 3.1では、ネームスペースsupports this directly in the form-login elementAuthentication.getDetails()は "ip"パラメータの値を返します。

既知のセキュリティ上の脆弱性があるため、おそらく3.0.4は使用しないでください。

また、「ip」パラメータの設定方法についても説明できますか?

+0

このルークのおかげで、プロキシ層は、クライアントのIPアドレスをURLの一部として含めるために、http要求パラメータから抽出できるように、incomming URLを書き換えます。私はこれを先に進め、私の進歩についてあなたに知らせるつもりです! –

+1

私はあなたのソリューションを実装し、それは素晴らしい動作します。 UsernamePasswordAuthenticationフィルターが呼び出されていない基本認証を使用しているときに、ちょっとした問題が発生しました。代わりにBasicAuthenticationFilterを使用しました。 BASIC_AUTH_FILTERの '_before_'に配置されます。私は春のセキュリティフレームワークの機能に驚いており、さらにそれを探求することを楽しみにしています!あなたのお手伝いをありがとう。 –

関連する問題