2010-12-27 13 views
6

私は、JOIDライブラリに基づいてOpenIDフィルタを作成し、アプリケーションがローカルのOpenID Serverに対して透過的に認証できるようにしています。 OpenIDはHTTPリダイレクトを介して動作するため、処理中に元のリクエストオブジェクトが失われてしまいます。特にデータ本体のPOSTの場合は特にそうです。ユーザーが認証された後、トランザクションで後で再利用できるようにリクエストオブジェクトを保存することは可能ですか?クエリーURLを往復リダイレクトで簡単に(OpenIDのreturn-to-urlを使用して)保存できるので、メッセージ本体自体を保存するだけで十分です。サーブレットフィルタでリクエストを保存して再利用しますか?

これは、基礎となるサーブレットに対して完全に透過的にしたいので、ユーザがこの特定の要求のOpenIDフローを通過したか、または有効な/認証されたローカルセッションを持っているかにかかわらず同じように動作します。

答えて

6

セッションスコープのMapに関心のあるデータ(リクエストパラメータ、リクエスト属性など)を、固有のIDで格納して、返品先URLに追加します。

String id = UUID.randomUUID().toString(); 
DataOfInterest data = new DataOfInterest(request); 
Map<String, DataOfInterest> map = (Map<String, DataOfInterest) session.getAttribute("dataOfInterest"); 
map.put(id, data); 
returnToUrl += "?token=" + URLEncoder.encode(id, "UTF-8"); 
// ... 

そして、それが戻ってくるときに、あなたがgetParameter()をオーバーライドして、関心の元のデータを返すためにCONSORTS前記現在のリクエストをラップするHttpServletRequestWrapperを使用しています。これはFilterで行います。

String id = request.getParameter(token); 
Map<String, DataOfInterest> map = (Map<String, DataOfInterest) session.getAttribute("dataOfInterest"); 
DataOfInterest data = map.remove(id); 
chain.doFilter(new HttpServletRequestWithDataOfInterest(request, data), response); 

HttpServletRequestWithDataOfInterestは次のようになります。

public class HttpServletRequestWithDataOfInterest extends HttpServletRequestWrapper { 

    private DataOfInterest data; 

    public HttpServletRequestWithDataOfInterest(HttpServletRequest request, DataOfInterest data) { 
     super(request); 
     this.data = data; 
    } 

    public String getParameter(String name) { 
     return data.getParameter(name); 
    } 

    public String[] getParameterValues(String name) { 
     return data.getParameterValues(name); 
    } 

    // Etc, only when necessary. 
} 

注:任意の明白なnullcheckなどを扱うには、あなた次第です。

+0

私はHttpServletRequestWrapperについて知りませんでした - 私は必要な配線のような音。 – jricher

+0

ようこそ。 – BalusC

1

いいえ、リクエストを保存することはできません。しかし、フィルタでセッションを作成し、そのオブジェクトをセッションスコープに追加することができます。セッションにアクセスできるオブジェクトは、見つかったオブジェクトを使用できます。

2

一般的な使い方では、要求本体だけを保存するよりも複雑であり、ヘッダーなども保存する必要があります。

how it's implemented in Spring Securityをチェックしてください。

+0

これは本当です。したがって、私は古いリクエストオブジェクト自体を直接保存して、すべての解析を短絡することを望んでいました。 – jricher

0

これと一緒に約1週間戦うと、スタンドアロンのカスタムフィルタの代わりにSpring Securityを完全に使用するようにアプリケーションを切り替えることができました。すばらしいです。 Spring Securityフレームワークでは、リダイレクトや要求の延期という奇妙な問題の多くを処理しています。

皆様のおかげで、

関連する問題