2016-11-03 8 views
0

私は、ユーザのログインサイトとして動作するSpringブートWebアプリケーションを作成しています。 REST APIの裏側では、OpenAMを使用して資格情報を検証し、セッショントークンを作成しています。トークンは、このログインサイトとユーザーに提供する他のすべてのサイト(シングルサインオン)のセッションを管理するために使用されることが期待されます。サードパーティのセッションクッキーを使用したSpringセキュリティカスタムログインサイト

私はSpringBootアプリケーションをステートレスにしたいと考えています。これにより、展開がずっと簡単になります。サイトはステートレスでなければなりませんが、明らかにOpenAMでセッション状態を維持しています。

私は、Spring Securityが認識する有効なセッションをクッキーが表すことができるようにSpring Securityを設定する方法に苦労しています。アプリケーションをステートレスにすると、OpenFrameセッショントークンがCookieに含まれているすべてのリクエストで再認証され、新しいCSRFヘッダーが作成される(セッションから保護される)と考えられるため、CSRF保護に関するあらゆる問題が発生します。固定)。

私は認証タイプとしてPreAuthenticationTokenを使用しています。私はRembemberMeAuthenticationTokenを使用すべきですか?新しいSessionAuthenticationStrategyを導入する必要がありますか?理想的には、実際のログインPOSTだけが、新しいセッションが作成されたとSpring Securityに認識させます。セッションCookieを持つ後続のすべてのリクエストについては、認証されたように処理されます。 (私はすべての要求とOpenAMのトークンを検証する予定です)

思考? Andrew

答えて

0

ForgeRockセッショントークンとデフォルトのSpringセキュリティHttpSessionの両方を使用するハイブリッドサイトを作成しました。 CSRFとセッションハイジャックの保護を提供するために、完全にセッションレスのアプリケーションを作成することは非常に困難です。

私のアプリでは、Springセッションを使用してCSRFとセッションハイジャックのプロジェクションを提供し、キャッシュとしても機能します。 Springセッションは30秒間持続します。その間、すべての要求は格納されたプリンシパル情報を利用し、ForgeRockを検証して検証する必要はありません。 30秒後に、Springセッションが終了し、ForgeRockセッションが再検証され、OpenAMから更新されたプリンシパル情報が取得されます。

私は、この機能を有効にするためにSpring Securityアプリにいくつかのフックを実装しました。私は、Spring Boot、Spring Security、およびJava Configurationの方法をすべて一緒に配線する方法を利用しました。

  • AbstractPreAuthenticatedProcessingFilterフィルタを自分のOpenAmCookieAuthenticationフィルタに置き換えました。 doFilter()メソッドでは、HttpSessionの存続期間をチェックします。 'x'秒より長い場合、セッションを無効にします。これにより、将来のフィルタはOpenAMのクッキーを再検証し、OpenAMのプリンシパル情報を取得します。
  • UsernamePasswordAuthenticationFilterフィルタを自分のフィルタに置き換えました。明確にするために、私はここに私自身のフィルタを実装していませんでした、ちょうどUsernamePasswordAuthenticationFilterインスタンスを設定しました。私は独自のカスタム成功と失敗のハンドラを設定しました
    • 私は自分の成功ハンドラを作成し、OpenAMでの認証に成功するとOpenAMセッションクッキーを設定しました。それは拡張されましたSavedRequestAwareAuthenticationSuccessHandler
    • クッキーをクリアするログイン失敗を処理するために私自身の失敗ハンドラを作成しました。それは延長したExceptionMappingAuthenticationFailureHandler
  • authenticationManagerBean()をオーバーロードします。それでもProviderManagerクラスを使用しますが、私は自分の認証プロバイダのリストに入れます
    • AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken>インターフェイスを実装するUserDetailsServiceを作成します。 (Springセッションが30秒後に期限切れになった後に)検証が必要なOpenAMセッショントークンがある場合に使用されます。
    • AuthenticationProviderインターフェイスを実装する認証プロバイダを作成します。これは、OpenAMを使用してユーザーの資格情報を検証するための標準的なログインプロセスで使用されます。

は最後に、私はアプリは完全にステートレスで作ることができなかったことから、私は、埋め込まれたTomcatインスタンスを使用して簡単なセッションレプリケーションを実装しました。この実装はこの投稿に影響を受けました:enter link description here

関連する問題